1

this例如:开放泛型和反模式的DI绑定?

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

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

问题是你不能拥有一个类型为IRepository <>的成员/参数变量,因此拥有这个绑定实例的唯一方法是通过一个带有Type请求的工厂。即

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

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

public Foo(IRepository<dynamic> repository) 
{} 

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

我在问以上是因为another question我问过开放式的泛型;在这方面下面...

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

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

回答

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) 

我不没有看到任何反义模式。如果通用存储库是反模式是另一个问题,但不是这个问题的一部分。

和获取开放式泛型的动态确实工作

ctor(IRepository<dynamic> dynamicRepository)