我正试图弄清楚如何让DryIoc解决ExampleClass上的ITest?
这是将参数名称与服务密钥匹配,因为有多个注册来定位正确的服务。
public class Program
{
public void Main()
{
var container = new Container();
container.Register<ITest, A>(serviceKey: "a");
container.Register<ITest, B>(serviceKey: "b");
container.Register<ExampleClass>();
var example = container.Resolve<ExampleClass>();
}
}
public interface ITest { }
public class A : ITest { }
public class B : ITest { }
public class ExampleClass
{
public ExampleClass(ITest a, ITest b)
{
}
}
使用Parameters.Of
https://www.fuget.org/packages/DryIoc.dll/4.2.5/lib/netstandard2.0/DryIoc.dll/DryIoc/Parameters
public class Program
{
public void Main()
{
var c = new Container();
c.Register<ITest, A>(serviceKey: "a");
c.Register<ITest, B>(serviceKey: "b");
c.Register<ExampleClass>(made:
Made.Of(parameters: Parameters.Of
.Name("a", serviceKey: "a")
.Name("b", serviceKey: "b")));
var example = c.Resolve<ExampleClass>();
}
}
您也可以省略Made.Of(parameters:
,因为Parameters.Of
返回的ParameterSelector
可以隐式转换为Made
:
c.Register<ExampleClass>(made:
Parameters.Of
.Name("a", serviceKey: "a")
.Name("b", serviceKey: "b"));
您可以在没有明确列出参数的情况下将参数名称应用于服务密钥的更通用的匹配,但考虑到稍后将添加非密钥参数,它将更加脆弱:
c.Register<ExampleClass>(made:
Parameters.Of.Details(
(req, parInfo) => ServiceDetails.Of(serviceKey: parInfo.Name)));
另一个类型安全选项是通过描述其位置参数的委托表达式(Linq.Expressions.Expression<T>
(直接指定构造函数-当构造函数更改时,此选项将通知您编译错误:
c.Register<ExampleClass>(made:
Made.Of(() =>
new ExampleClass(
Arg.Of<ITest>(serviceKey: "a"),
Arg.Of<ITest>(serviceKey: "b"))));
上述方法适用于特定的注册,但也可以在容器级别使用规则进行同样的操作:
var c = new Container(rules =>
rules.With(parameters:
Parameters.Of.Details(
(req, parInfo) => req.ServiceType == typeof(ExampleClass)
? ServiceDetails.Of(serviceKey: parInfo.Name)
: null)
));
注意:最后一个选项会影响性能,因为需要为所有注册检查规则。
相同的方法可以应用于使用PropertiesAndFields.Of
指定属性注入。