0

我目前正在将StructureMap集成到我们的业务层中,但由于双向依赖关系而出现问题。

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

每个管理器都实现了IManager接口:

internal interface IManager
{
  bool IsStarted { get; }

  void Start();
  void Stop();
}

并且还有自己特定的接口:

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

internal interface IManagerB : IManager
{
  void BLogic();
}

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

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() { }
}

这是我目前使用的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));
});

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

4

1 回答 1

9

病人:“医生,当我用手指戳我的眼睛时很痛”

医生:“别再用手指戳你的眼睛了。”

不,不会有保持当前设计的“简单”或“干净”解决方案。当直觉和您的工具告诉您设计不起作用时,倾听可能是个好主意。

如果某些东西需要一个IManagerA和一个IManagerB,那么它应该将它们都作为依赖项。依赖注入工具,例如 StructureMap,可以让这些类型的组合场景变得简单——不要抗拒它。

于 2010-05-03T03:39:05.730 回答