2017-02-24 1 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 기존 인스턴스를 삽입 할 수 있습니다. Caslte Windsor는 그것을 할 수 있습니다. 다른 사람들도이 기능을 소유하고 있는지 나는 알 수 없습니다. 예를 들어, 'container.Register (Component.For (). 인스턴스 (인스턴스))' –

+0

@ Adam1980 아마도 당신은 인스턴스를 직접 만들고 싶지 않지만 Castle Windsor와 같은 바운드 라이프 스타일을 이미 사용하고 있습니다. https://github.com/castleproject/Windsor/blob/master/docs/lifestyles.md#bound-to-nearest를 참조하십시오. –