开放泛型的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)

…这似乎是有可能的。

开放泛型的DI绑定是反模式吗?

我想你误解了开放泛型绑定是如何工作的。

你不能用_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)