StructureMap双向/循环依赖的问题

0 structuremap circular-dependency bidirectional

我目前正在我们的业务层中集成StructureMap,但由于双向依赖性而存在问题.

该层包含多个管理器,每个管理器可以相互调用方法:没有通信限制或规则.这还包括可能的循环依赖性,如下例所示.我知道设计本身是有问题的,但目前我们只是希望StructureMap能够工作,并将在未来专注于进一步的重构.

每个经理实现IManager接口:

internal interface IManager
{
  bool IsStarted { get; }

  void Start();
  void Stop();
}
Run Code Online (Sandbox Code Playgroud)

并且还有自己的特定界面:

internal interface IManagerA : IManager
{
  void ALogic();
}

internal interface IManagerB : IManager
{
  void BLogic();
}
Run Code Online (Sandbox Code Playgroud)

这是两个虚拟管理器实现:

internal class ManagerA : IManagerA
{
  public IManagerB ManagerB { get; set; }

  public void ALogic() { }

  public bool IsStarted { get; private set; }
  public void Start() { }
  public void Stop() { }
}

internal class ManagerB : IManagerB
{
  public IManagerA ManagerA { get; set; }

  public void BLogic() { }

  public bool IsStarted { get; private set; }
  public void Start() { }
  public void Stop() { }
}
Run Code Online (Sandbox Code Playgroud)

这是我目前使用的StructureMap配置.

我仍然不确定如何注册管理员,所以目前我正在使用手动注册.也许有人可以帮我这个.

For<IManagerA>().Singleton().Use<ManagerA>();
For<IManagerB>().Singleton().Use<ManagerB>();

SetAllProperties(convention =>
{
  // configure the property injection for all managers
  convention.Matching(prop => typeof(IManager).IsAssignableFrom(prop.PropertyType));
});
Run Code Online (Sandbox Code Playgroud)

毕竟我无法创建IManagerA因为StructureMap抱怨ManagerA和之间的循环依赖ManagerB.是否有一个简单而干净的解决方案来解决这个问题但是要保持当前的设计?

Jos*_*gan 10

病人:"医生,当我用手指戳我的眼睛时会疼

医生:"停止用手指戳你的眼睛."

不,没有"简单",也没有"干净"的解决方案来保持当前的设计.当直觉和你的工具告诉你设计不起作用时,听听可能是个好主意.

如果某些东西需要a IManagerA和a IManagerB,那么它应该将它们作为依赖项.像StructureMap这样的依赖注入工具使这些类型的合成场景变得容易 - 不要对抗它.