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

que*_*en3 11 c# dependency-injection

这是我想要的DI容器:

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

var obj = di.Resolve<Class>(() => new Class(null, "test"));
Run Code Online (Sandbox Code Playgroud)

兴趣点:

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

另一个主要要求是我希望自动拾取我的组件,即我不想注册类 - 我希望IoC能够选择它,因为它知道如何解决IDependency.

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

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

Mar*_*ann 29

我认为通过定义可以创建您的类的抽象工厂会更好.

public interface IFactory
{
    MyClass Create(string data);
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以像这样创建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
}
Run Code Online (Sandbox Code Playgroud)

在容器中,您将注册MyFactory和IDependency的实现.

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

var mc = container.Resolve<IFactory>().Create(data);
Run Code Online (Sandbox Code Playgroud)

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

  • 通过名称Abstract Factory调用它的加分点,但使用接口.我见过很多人,当他们听到*Abstract*Factory时,直接去抽象基类. (7认同)
  • 是的我知道这一点,虽然在我的情况下我犹豫不决,因为对于简单的情况来说,用接口,工厂,工厂的构造函数,Create方法等复制构造函数是过分的.虽然对于复杂的情况很好,但对于我认为简单的事情来说,它也是"DI爆炸" .问题仍然是自动注册DI容器. (2认同)