这就是我想要的DI容器:
public class Class
{
public Class(IDependency dependency, string data) { }
}
var obj = di.Resolve<Class>(() => new Class(null, "test"));
兴趣点:
另一个主要要求是我希望自动拾取我的组件,即我不想注册Class - 我希望IoC能够选择它,因为它知道如何解决IDependency。
此外,Property Injection有时很有用,但这是可选的。
问题实际上是关于功能的组合 - 拥有所有功能 - 类型安全,参数,自动拾取......很容易检查一个功能,但它们的组合不容易验证,除非一个人熟悉特定容器并了解其功能。因此问题。
答案 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);
这种方法完全是类型安全的,可以很好地将依赖项与运行时应用程序数据分离。