【问题标题】:Which DI container will satisfy this哪个 DI 容器可以满足这一点
【发布时间】:2010-12-13 19:01:24
【问题描述】:

这就是我想要的 DI 容器:

public class Class
{
   public Class(IDependency dependency, string data)  { }
}

var obj = di.Resolve<Class>(() => new Class(null, "test"));

兴趣点:

  1. 可以在构造函数中解析依赖和数据。
  2. 可以使用类型安全的语法来传递构造函数参数(确切的语法可能会有所不同)。是的,我可以通过从 (Expression.Body as NewExpression) 获取构造函数参数来自己完成 - 但我需要一种方法来检测容器中注册了哪些参数。

另一个主要要求是我希望我的组件被自动拾取,即我不想注册 Class - 我希望 IoC 拾取它,因为它知道如何解决 IDependency。

此外,属性注入有时也很有用,但这是可选的。

问题实际上是关于功能的组合 - 拥有所有功能 - 类型安全、参数、自动提取...检查一个功能很容易,但它们的组合不容易验证,除非熟悉特定容器并了解其功能。因此问题。

【问题讨论】:

  • 我认为没有任何容器支持这种语法。但是许多(几乎所有)容器都支持显式容器参数,并且可能具有更简洁的语法。
  • “可能”不是答案...据我所知,我可以传递 object[] 参数数组,但它显然不是类型安全的...我可以更改参数顺序并获胜直到运行时才知道这一点。
  • 更清洁的意思是您不需要像上面那样在代码中显式使用 ctor。而不是你写的,为什么不:var obj = new Class(di.Resolve&lt;IDependency&gt;(), "test");?
  • 因为 Class 是我在 MVC 中的 Controller 构造函数的参数,而 Controller 是由 DI 容器创建的。
  • 嗯,你说得对,这与构造函数无关(我不在那里传递参数)。好吧,还有另一个原因 - 如果我有 3 个参数,我将不得不做 3 次 Resolve,这是一些额外的代码。

标签: c# dependency-injection


【解决方案1】:

我认为你最好定义一个可以创建你的类的抽象工厂。

public interface IFactory
{
    MyClass Create(string data);
}

然后您可以像这样创建 IFactory 的实现:

public class MyFactory : IFactory
{
    private IDependency dependency;

    public MyFactory(IDependency dependency)
    {
        if (dependency == null)
        {
            throw new ArgumentNullException("dependency");
        }

        this.dependency = dependency;
    }

    #region IFactory Members

    public MyClass Create(string data)
    {
        return new MyClass(this.dependency, data);
    }

    #endregion
}

在您的容器中,您将同时注册 MyFactory 和 IDependency 的实现。

您现在可以使用容器来解析工厂,并使用工厂来获取类:

var mc = container.Resolve<IFactory>().Create(data);

这种方法是完全类型安全的,并且很好地将依赖关系与运行时应用程序数据分离。

【讨论】:

  • 通过名称抽象工厂调用它的奖励积分,但使用接口。我见过很多人,当他们听到 Abstract Factory 时,会直接使用抽象基类。
  • 是的,我知道这一点,但在我的情况下,我犹豫不决,因为对于简单的情况,用接口、工厂、工厂的构造函数、Create 方法等复制构造函数是矫枉过正的。虽然对复杂的情况有好处,但它也太“ DI 爆炸”我认为是简单的事情。问题仍然是关于自动注册 DI 容器。
  • @queen3:我明白你的意思,但我不知道有任何 DI 容器可以满足你的要求。顺便说一句,AutoFixture (autofixture.codeplex.com) 的语法与您询问的语法非常接近,但它不是 DI 容器:/ 我确实看到了您关于自动注册的其他问题,但(还)没有很好的答案。
  • 我目前正在考虑自己实现类型安全的创建和自动注册,为此我需要从类型中知道“是否可以通过容器实例化类型” - 我认为 stackoverflow.com/questions/1550190/… 会做但我不确定。当然,已经做到这一点的容器比半生不熟的自定义解决方案要好得多......
  • @Martinho 那一点是我的,因为我立即想到了一个抽象基类......
猜你喜欢
  • 2018-03-04
  • 2015-02-06
  • 2012-03-07
  • 1970-01-01
  • 1970-01-01
  • 2012-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多