2010-05-02 74 views
0

我目前在我们的业务层中集成了StructureMap,但由于双向依赖关系而出现问题。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 c我现在使用的配置。

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

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抱怨ManagerAManagerB之间的循环依赖。有没有一个简单而干净的解决方案来解决这个问题,但保持当前的设计?

回答

9

病人:“医生,这很伤我戳我的手指 在我的眼”

医生:“停止 你的眼睛戳你的手指”

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

如果有事需要IManagerAIManagerB,那么它应该把它们当作依赖关系。像StructureMap这样的依赖注入工具可以使这些类型的组合场景变得轻松 - 不要与之对抗。