如何使用structuremap解决子类和父类之间的相同依赖关系

时间:2011-06-27 18:04:09

标签: c# .net structuremap

我有几个看起来像这样的课程

public class ParentClass
{
    public ParentClass(IChildClass childClass, IDependency dependency)
    { }
}

public ChildClass : IChildClass
{
    public ParentClass(IDependency dependency)
    { }
}

有没有办法通过StructureMap注册ParentClass,以便它与IDependency ParentClassIChildClass之间的ParentClass解析?

修改

为了澄清,我正在寻求解决IDependency dependency = new Dependency(); ChildClass childClass = new ChildClass(dependency); ParentClass parentClass = new ParentClass(childClass, dependency); ,好像它是这样手动创建的(来自MrFox的回答):

IDependency

ParentClass 应该是单身人士。我想每次使用不同的IDependency解决{{1}}。

3 个答案:

答案 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);