解析带有构造函数参数的所有注册类型的列表
本文关键字:注册 类型 列表 参数 构造函数 | 更新日期: 2023-09-27 18:11:28
我能够通过执行
获得所有注册类型的列表var myTypes = kernel.Get<List<IMyInterface>>();
MyType实现需要接受构造函数参数。我想我可以通过
kernel.Get<List<IMyInterface>>(
new ConstructorArgument("argName", argValue ) );
,但这似乎不起作用。我得到一个异常,说它试图解析参数"argName",不能。我猜它正在尝试将该参数用于列表,而不是列表中的每种类型。
有办法做到这一点吗?
更新:
我可以通过
var types =
from t in typeof(IMyInterface).Assembly.DefinedTypes
where typeof(IMyInterface).IsAssignableFrom(t)
where t.IsClass
select (IMyInterface)kernel.Get(t,
new ConstructorArgument("argName", argValue));
这是不理想的
更新:
我最终改变了我的类构造函数,使其不接受参数。我认为我让它工作的方式不是一个好的DI实践。
可以在Bindings类型中指定构造函数参数
kernel.Bind<IMyInterface>().To<MyType>().WithConstructorArgument("argName",argValue);
绑定好后,argValue将被注入到MyType构造函数中。
更新:如果参数只有在运行时才知道,你可以这样做:
在绑定中从请求参数中获取构造函数的值:
kernel.Bind<IMyInterface>().To<MyType>().WithConstructorArgument("argName",
r => r.Parameters.First().GetValue(r.Request.ParentContext, r.Request.Target));
创建实例时,将参数传递给request:
kernel.Get<List<IMyInterface>>( new Ninject.Parameters.Parameter("argName",argValue) );
如果你想要所有的注册类型,你应该使用GetAll<T>
而不是Get<List<T>>
:
kernel.GetAll<IMyInterface>(new ConstructorArgument("argName",argValue));
如果你真的需要使用LINQ的ToList
,你可以将它具体化为一个列表