以this为例:
Bind(typeof(IRepository<>)).To(typeof(Repository<>));
这对NInject有效,我的问题是这是否是滥用/反模式。
这个问题是你不能拥有IRepository&lt;&gt;类型的成员/参数变量,因此拥有此绑定实例的唯一方法是通过具有Type请求的工厂。即。
_kernel.Get(typeof(IRepository<>));
探索的一条可能途径可能是使用动力学;
public Foo(IRepository<dynamic> repository)
{}
至少在这里我们有一个注入的构造函数参数,它遵循控制的反转。
我问上面是因为another question我问过开放式仿制药;在这方面,以下......
public Foo(IEnumerable<IRepository<dynamic>> allRepoInstancesInjected)
......似乎应该是可能的。
答案 0 :(得分:3)
我认为您错过了开放式通用绑定的工作原理。
您无法使用_kernel.Get(typeof(IRepository<>));
解析开放式泛型。这只会引发异常。你也无法获得所有可能的封闭式泛型。或者您期望IEnumerable<IList<T>>
期望返回什么?有多少IList
与所有曾经和将要在地球上实施的类相结合?
您可以使用它们来获得指定的封闭式泛型。例如。而不是定义应用程序中使用的所有封闭泛型,如:
Bind(typeof(IRepository<Foo>)).To(typeof(Repository<Foo>));
Bind(typeof(IRepository<Bar>)).To(typeof(Repository<Bar>));
Bind(typeof(IRepository<Baz>)).To(typeof(Repository<Baz>));
您只需定义一次
Bind(typeof(IRepository<>)).To(typeof(Repository<>));
然后你可以将它们作为封闭的通用依赖项
ctor(IRepository<Foo> fooRepository)
我没有看到任何反模式的DI方式。如果通用存储库是反模式,则是另一个问题,但不是此问题的一部分。
获得开放式通用的动态确实有效
ctor(IRepository<dynamic> dynamicRepository)