开放泛型的DI绑定是反模式吗?
本文关键字:模式 绑定 泛型 DI | 更新日期: 2023-09-27 18:01:36
举个例子:
Bind(typeof(IRepository<>)).To(typeof(Repository<>));
这对NInject是有效的,我的问题是这是否是一个滥用/反模式。
这样做的问题是您不能拥有IRepository<>类型的成员/参数变量,因此拥有此绑定实例的唯一方法是通过带有type请求的工厂。例如
_kernel.Get(typeof(IRepository<>));
一个可能的探索途径可能是使用动力学;
public Foo(IRepository<dynamic> repository)
{}
至少这里有一个被注入的构造函数实参,它遵循控制反转。
我问上面的问题是因为我问了另一个关于开放泛型的问题;在此背景下,以下……
public Foo(IEnumerable<IRepository<dynamic>> allRepoInstancesInjected)
…这似乎是有可能的。
我想你误解了开放泛型绑定是如何工作的。
你不能用_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)