2014-03-24 3 views
0

다양한 규칙과 예외가있는 매우 복잡한 도메인이 있으며 추상 팩토리가이 정글에서 나를 도울 수 있는지 궁금합니다.generics가있는 추상 팩터 리

도메인 정보

네트워크의 다양한 상이한 하드웨어 장치가있다. 모두 IP 주소를 가지고 있지만 송신기 또는 수신기 유형입니다 (구성에 따라 변경 될 수 있음). 액세스하는 방법 (프로토콜) 및 이러한 액세스 포인트의 모양은 장치 자체에 따라 다릅니다.

도메인

public abstract class NetworkDevice { 

    public IPAddress IpAddress { get; set; } 
    public List<Endpoint> Endpoints { get; set; } 
    public NetworkConfiguration NetworkConfiguration { get; set; } 

} 

public abstract class Endpoint { 

    public bool IsMulticast { get; set; } 
    public string PayloadType { get; set; } 

} 

public IPCamera: NetworkDevice { 

    // a IPCamera usually has various RTSP endpoints 
    // Is the following solution acceptable v 
    public List<RtspEndpoint> RtspEndpoints { 
     get { 
      return this.Endpoints.Where(x => x is RtspEndpoint); 
     } 
    } 

} 

public RtspEndpoint : Endpoint { 

    public string MediaControl { get; set; } 

} 

public abstract SpecialDevice : NetworkDevice { 

    // this device has RTSP and ONVIF endpoints 
    // and can be EITHER transmitter or receiver 
    // depending on configuration 

} 

public SpecialDeviceTransmitter : SpecialDevice { 

    // has RTSP & ONVIF endpoints 

} 

public SpecialDeviceReceiver { 

    // has only ONVIF endpoints 

} 

지금, 나는 3 RTSP 엔드 포인트 및 1 ONVIF 엔드 포인트의 미리 정의 된 설정을 가진 SpecialDeviceTransmitter의 새 인스턴스를 만들 싶습니다. 열거 형이 없으면 어떻게 만들 수 있습니까? 그리고 가능한 모든 장치와 종단점을위한 공장이 필요합니까?

답변

0

리플렉션을 사용하여 여러 유형의 생성자를 호출 할 수 있습니다. 예 : 모든 유형 당신은 엔드 포인트의 배열을 받아들이는 생성자를 생성하고이 같은 객체 생성 구현할 수 있습니다

T CreateDevice<T>(params Endpoint[] endpts) where T: class 
    { 
     ConstructorInfo ctor = typeof(T).GetConstructor(new[] { typeof(Endpoint[]) }); 

     return ctor.Invoke(new object[] { endpts}) as T; 

    } 

같은 패턴뿐만 아니라 Endpoint 창조의 다양한 유형에 구현 될 수 있습니다. 오류 검사가 생략되었습니다.

0

구현 세부 정보의 경우 SpecialDevice 클래스는 IsReceiver이라는 부울 값을 가질 수 있으며 실제 장치의 구성에 따라 설정됩니다. 그러나 이것은 단지 둘 중 하나 일 수 있다고 가정합니다.

SpecialDeviceEndPoint의 경우 IPCamera과 같이 EndPoint의 모음을 사용할 수 있습니다.

[Flags] 
    public enum EndpointFlags 
    { 
     Onvif = 0x10, 
     Rtsp = 0x100, 
    } 

을 그리고 당신의 장치 엔드 포인트의 특정 유형을 지원하는지 확인하기 위해 HasFlag 전화 : 당신이 당신의 장치가 지원하는 어떤 엔드 포인트의 종류 알고 싶은 경우에 당신은 너무 같은 [Flags] 열거를 사용할 수 있습니다.

관련 문제