哪个DI容器会满足这个要求

时间:2009-11-06 10:34:41

标签: c# dependency-injection

这就是我想要的DI容器:

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

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

兴趣点:

  1. 可以在构造函数中解析依赖项和数据。
  2. 可以使用类型安全语法来传递构造函数参数(确切的语法可能会有所不同)。是的,我可以通过从(Expression.Body作为NewExpression)获取构造函数参数来自己完成 - 但我需要一种方法来检测容器中注册的参数。
  3. 另一个主要要求是我希望自动拾取我的组件,即我不想注册Class - 我希望IoC能够选择它,因为它知道如何解决IDependency。

    此外,Property Injection有时很有用,但这是可选的。

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

1 个答案:

答案 0 :(得分:28)

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

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的实现。

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

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

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