解析带有构造函数参数的所有注册类型的列表

本文关键字:注册 类型 列表 参数 构造函数 | 更新日期: 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,你可以将它具体化为一个列表