我目前正在业务层中集成 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
之间的循环依赖关系。是否有一个简单而干净的解决方案来解决这个问题但是要保持当前的设计?
答案 0 :(得分:10)
病人:“医生,我捅我的时候疼 手指在我眼中“ 医生:“别再用手指戳了戳 你的眼睛。“
不,没有“简单”,也没有“干净”的解决方案来保持当前的设计。当直觉和你的工具告诉你设计不起作用时,听听它可能是一个好主意。
如果某些内容需要IManagerA
和IManagerB
,那么它应该将它们作为依赖项。像StructureMap这样的依赖注入工具使这些类型的合成场景变得容易 - 不要与它对抗。