C# 无法选择从另一个已注册实例属性解析参数的构造函数
下面的示例将applicationconfiguration实例的属性注册到容器中,下一次注册将使用该属性作为控制台编写器的构造函数C# 无法选择从另一个已注册实例属性解析参数的构造函数,c#,dryioc,C#,Dryioc,下面的示例将applicationconfiguration实例的属性注册到容器中,下一次注册将使用该属性作为控制台编写器的构造函数 container.Register( Made.Of(r => ServiceInfo.Of<ApplicationConfiguration>(), f => f.SomeConfigurationValue), serviceKey: nameof(Application
container.Register(
Made.Of(r => ServiceInfo.Of<ApplicationConfiguration>(), f => f.SomeConfigurationValue),
serviceKey: nameof(ApplicationConfiguration.SomeConfigurationValue));
container.Register(
Made.Of(
() => new ConsoleWriter(
Arg.Of<string>(nameof(ApplicationConfiguration.SomeConfigurationValue)))));
有没有办法做到这一点?这是我们的示例类。我们只想注册这两个类
private class ApplicationConfiguration
{
internal string SomeConfigurationValue => "Hello World";
}
private class ConsoleWriter
{
private readonly string _message;
internal ConsoleWriter(string message)
{
this._message = message;
}
internal void Write(int times = 1)
{
for (var i = 0; i < times; i++) Console.WriteLine(this._message);
}
}
私有类应用程序配置
{
内部字符串SomeConfigurationValue=>“Hello World”;
}
私有类控制台编写器
{
私有只读字符串\u消息;
内部控制台编写器(字符串消息)
{
这个。_message=消息;
}
内部无效写入(整数倍=1)
{
对于(var i=0;i
选项1:
c、 登记册(
由(()=>新ConsoleWriter(参数索引(0))制成,
_=>c.Resolve().SomeConfigurationValue));
选项2:如果将ConsoleWriter构造函数更改为public
c、 寄存器(制造:的参数)
.Name(“message”,_=>c.Resolve().SomeConfigurationValue));
选项3:最简单的,可能是最好的一个使用。
c、 注册删除门(
r=>new ConsoleWriter(r.Resolve().SomeConfigurationValue));
Unable to resolve String {ServiceKey=DryIoc.Made+TypedMade`1[System.String]}
as parameter "message"
in DryIoc.Program.ConsoleWriter.
Where no service registrations found
and number of Rules.FallbackContainers: 0
and number of Rules.UnknownServiceResolvers: 0
private class ApplicationConfiguration
{
internal string SomeConfigurationValue => "Hello World";
}
private class ConsoleWriter
{
private readonly string _message;
internal ConsoleWriter(string message)
{
this._message = message;
}
internal void Write(int times = 1)
{
for (var i = 0; i < times; i++) Console.WriteLine(this._message);
}
}
option 1:
c.Register<ConsoleWriter>(
Made.Of(() => new ConsoleWriter(Arg.Index<string>(0)),
_ => c.Resolve<ApplicationConfiguration>().SomeConfigurationValue));
option 2: if you change the ConsoleWriter constructor to public
c.Register<ConsoleWriter>(made: Parameters.Of
.Name("message", _ => c.Resolve<ApplicationConfiguration>().SomeConfigurationValue));
option 3: the simplest, may be the best one to use.
c.RegisterDelegate<ConsoleWriter>(
r => new ConsoleWriter(r.Resolve<ApplicationConfiguration>().SomeConfigurationValue));