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

本文关键字:依赖 关系 之间 父类 structuremap 何使用 解决 子类 | 更新日期: 2023-09-27 18:00:27

我有几个类看起来像这个

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

有没有一种方法可以通过StructureMap注册ParentClass,使其与ParentClassIChildClass之间的同一实例IDependency解析?

编辑

为了澄清,我希望解析ParentClass,就好像它是手动创建的一样(根据Fox先生的回答):

IDependency dependency = new Dependency();
ChildClass childClass = new ChildClass(dependency);
ParentClass parentClass = new ParentClass(childClass, dependency);

IDependency应该而不是是单例。我想每次使用不同的IDependency来解析ParentClass

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

这里的代码将为Parent和child提供相同的IDdependency。

var container = new Container(x => {
            x.For<IChildClass>().Use<ChildClass>();
            x.For<IDependency>().Use<Dependency>();
        });
var firstParent = container.GetInstance<ParentClass>();

如果你在哪里要求另一个container.GetInstance<ParentClass>();,它会给你一个新的父母、孩子和依赖关系。如果您想将IDdependency作为一个单独的类,以便每次请求父类或子类时都使用它,那么您可以使用Singeleton方法注册它:x.For<IDependency>().Singleton().Use<Dependency>();

我无法回答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容器。

将一个IDdependency对象的引用传递给两个构造函数:

IDependency dependency = new Dependency();
ChildClass childClass = new ChildClass(dependency);
ParentClass parentClass = new ParentClass(childClass, dependency);