2017-02-24 77 views
0

假设我有一组条件需求,它们可以像结构树一样嵌套在一个树中,但所有需求都需要与不同的子系统进行通信以了解它们是否得到满足。例如,一个需求可能会检查是否存在某个库存项目,可能会检查某个特定属性的对象,可能会检查某个事件系统以查看某个事件是否已经启动等。您如何对此进行建模,以便可以遍历树作为部分 - 整体层次结构,但是也允许每个节点与需要的子系统进行通信?松耦合复合对象节点及其依赖关系

回答

0

您似乎应该对聚合进行建模并稍后使用依赖注入(请参阅What is dependency injection?)来要求应满足所需功能的任何对象。

每个节点就像一个domain model

事情是这样的:

public class A 
{ 
    // You inject some service IServiceX 
    public A(IServiceX serviceX) 
    { 
     ServiceX = serviceX; 
    } 

    private IServiceX ServiceX { get; } 

    // B is associated to A 
    public B B { get; set; } 

    // So you can do some stuff calling the whole ServiceX 
    public void DoStuff() 
    { 
     ServiceX.DoWhatever(); 
    } 
} 

public class B 
{ 
    public B(IServiceY serviceY) 
    { 
     ServiceY = serviceY; 
    } 

    private IServiceY ServiceY { get; } 

    // C is associated to B 
    public C C { get; set; } 

    public void DoStuff() 
    { 
     ServiceY.DoWhatever(); 
    } 
} 

public class C 
{  
    public C(IServiceZ serviceZ) 
    { 
     IServiceZ = serviceZ; 
    } 

    private IServiceZ IServiceZ { get; } 

    public void DoStuff() 
    { 
     IServiceZ.DoWhatever(); 
    } 
} 

很明显,你可以注入比服务更进一些聚集体。由于每个聚合体都与另一个聚合体相关联,因此您应该也能够遍历该树。

+0

我的意思是子系统与节点的连接,而不是树中的节点。我认为依赖注入看起来很有希望。依赖注入是否允许注入一个已经被实例化的对象,或者它会为每个构造函数或属性注入一个新的实例? – Adam1980

+0

@ Adam1980您可以注入现有的实例。温莎能做到这一点,我不知道别人是否也拥有这种能力。例如'container.Register(Component.For ().Instance(instance))' –

+0

@ Adam1980顺便说一句,你可能不想自己创建实例,但是使用像Castle Windsor这样的约束生活方式已经提供了。看到这个https://github.com/castleproject/Windsor/blob/master/docs/lifestyles.md#bound-to-nearest –