1

举个例子

Bind(typeof(IRepository<>)).To(typeof(Repository<>));

这对 NInject 有效,我的问题是这是否是滥用/反模式。

这样做的问题是您不能拥有 IRepository<> 类型的成员/参数变量,因此拥有此绑定实例的唯一方法是通过具有类型请求的工厂。IE

_kernel.Get(typeof(IRepository<>));

一种可能的探索途径可能是使用动力学;

public Foo(IRepository<dynamic> repository)
{}

至少在这里我们有一个注入的构造函数参数,它遵循控制反转。

我之所以问上述问题,是因为我问了另一个关于开放泛型的问题;在这种情况下,以下...

public Foo(IEnumerable<IRepository<dynamic>> allRepoInstancesInjected)

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

4

1 回答 1

5

我认为您误解了开放通用绑定的工作原理。

您无法解析开放的泛型,_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)
于 2013-02-28T21:17:19.330 回答