DI开放通用的绑定是反模式吗?

时间:2013-02-28 09:07:05

标签: c# generics dependency-injection inversion-of-control ninject

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)

......似乎应该是可能的。

1 个答案:

答案 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)