【问题标题】:Is DI Binding of an Open Generic an Anti-Pattern?开放泛型的 DI 绑定是反模式吗?
【发布时间】:2013-02-14 09:40:44
【问题描述】:

this为例:

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)

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

【问题讨论】:

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


    【解决方案1】:

    我认为您误解了开放式泛型绑定的工作原理。

    您无法使用_kernel.Get(typeof(IRepository&lt;&gt;)); 解析开放的泛型,这只会引发异常。您也无法获得所有可能的封闭泛型的可枚举。或者您期望IEnumerable&lt;IList&lt;T&gt;&gt; 期望返回什么?可枚举的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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-11
      • 2016-12-26
      • 2023-04-01
      • 2019-12-07
      • 2011-10-08
      • 1970-01-01
      • 2015-12-08
      • 1970-01-01
      相关资源
      最近更新 更多