0

我可以通过做得到所有注册类型的列表

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 实践。

4

2 回答 2

2

您可以在类型 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));

创建实例时,将参数传递给请求:

kernel.Get<List<IMyInterface>>( new Ninject.Parameters.Parameter("argName",argValue) );
于 2013-04-30T16:30:19.797 回答
2

如果你想要所有注册的类型,你应该使用GetAll<T>而不是Get<List<T>>

kernel.GetAll<IMyInterface>(new ConstructorArgument("argName",argValue));

如果您确实需要使用 LINQ 的ToList.

于 2013-05-01T06:01:13.137 回答