我有几个看起来像这样的课程
public class ParentClass
{
public ParentClass(IChildClass childClass, IDependency dependency)
{ }
}
public ChildClass : IChildClass
{
public ParentClass(IDependency dependency)
{ }
}
有没有办法通过StructureMap注册ParentClass,以便它与IDependency
ParentClass
和IChildClass
之间的ParentClass
解析?
修改
为了澄清,我正在寻求解决IDependency dependency = new Dependency();
ChildClass childClass = new ChildClass(dependency);
ParentClass parentClass = new ParentClass(childClass, dependency);
,好像它是这样手动创建的(来自MrFox的回答):
IDependency
ParentClass
不应该是单身人士。我想每次使用不同的IDependency
解决{{1}}。
答案 0 :(得分:3)
此处的代码将为您提供父母和子女的相同IDependency。
var container = new Container(x => {
x.For<IChildClass>().Use<ChildClass>();
x.For<IDependency>().Use<Dependency>();
});
var firstParent = container.GetInstance<ParentClass>();
如果你在哪里要求另一个container.GetInstance<ParentClass>();
它会给你一个新的父母,孩子和依赖。如果您希望将IDependency作为singelton,那么每次您要求父类或子类时都会使用它,那么您可以使用Singeleton方法注册它:x.For<IDependency>().Singleton().Use<Dependency>();
答案 1 :(得分:2)
我无法回答StructureMap是否可以这样做。但是使用工厂从父级中创建子级可以为您提供与IoC容器无关的解决方案。
public interface IChildFactory {
IChild Create(IDependency dependency);
}
public class ParentClass
{
private readonly IChildClass _child;
public ParentClass(IChildFactory childFactory, IDependency dependency)
{
_child = childFactory.Create(dependency);
}
}
class ChildFactory : IChildFactory
{
IChildClass Create(IDependency dependency)
{
return new ChildClass(dependency);
}
}
现在所有IChild
个实例都是由这个简单的工厂而不是通过IoC容器创建的。
答案 2 :(得分:1)
将一个IDependency对象的引用传递给两个构造函数:
IDependency dependency = new Dependency();
ChildClass childClass = new ChildClass(dependency);
ParentClass parentClass = new ParentClass(childClass, dependency);