2014-07-11 3 views
2

나는 내 설계에서 공분산/반공립 문제라고 생각하는 것을 고민하고있다. 내가 런타임에 알려진 유일한 일반적인 개체를 반환 싶어요.이것은 내 설계와 공분산/반공립성 문제입니까?

나는 다음의 클래스/인터페이스가

public interface IBaseRepository 
{ 
    int UserId { get; set; } 

    // Retrieve 
    SyncData GetRetrieveData(); 

    // Update 
    SyncData GetUpdateData(); 
} 

public interface IDomainRepository<T> : IBaseRepository where T : IDomainObject 
{ 
    object GetValue(T domainObject, string id); 
    void SetValue(T domainObject, string id, object value); 

    // retrieve data 
    BatchResults<T> Retrieve(); 

    // update data 
    BatchResults<T> Update(SynchroniseList synchroniseList); 
} 

나는이 일부 구현이 있습니다

public abstract class BaseRepository : IBaseRepository 
{ 
    public int UserId { get; set; } 

    public virtual SyncData GetRetrieveData() 
    { 
     return new SyncData(); 
    } 

    public virtual SyncData GetUpdateData() 
    { 
     return new SyncData(); 
    } 
} 

public MyTaskRepository : BaseRepository, IDomainRepository<MyTask> 
{ 
    public object GetValue(MyTask domainObject, string id) 
    { 
     return domainObject.GetValue(); 
    } 

    void SetValue(MyTask domainObject, string id, object value) 
    { 
     domainObject.SetValue(); 
    } 

    // retrieve data 
    public BatchResults<MyTask> Retrieve() 
    { 
     // do stuff specific to MyTask 
     return new BatchResults<MyTask>(); 
    } 

    // update data 
    BatchResults<T> Update(SynchroniseList synchroniseList) 
    { 
     // do stuff specific to MyTask 
     return new BatchResults<MyTask>(); 
    } 
} 

public MyOtherTaskRepository : BaseRepository, IDomainRepository<MyOtherTask> 
{ 
    ... 
} 

이 저장소를 사용하는 경우 오전 데 문제가 있습니다. 내가 가지고있는 양식에서

IBaseRepository repo = RepositoryFactory.Create(some parameters); 

이것은 내 검색/업데이트 데이터를 가져 오거나 설정할 수있는 IDomainRepository를 반환합니다.

그러나 Retrieve/Update를 호출하는 방법을 알지 못합니다. IDomainRepository에 캐스트 할 수 없기 때문에 내가 어떤 도메인 객체를 사용할 지 알지 못하기 때문입니다.

나는 공분산/반항에 관해서 그 내용과 관련이 있다고 생각하고 있습니다. 그러나 내 설계가 잘못되었다는 느낌이 너무 복잡합니다. 나는이 사실을 C# 2.0에서 구현할 수 있다고 믿는다. 그래서 나는 이벤트가 공분산/반항에 대해 걱정해야한다고 생각한다.

내 설계입니까, 아니면 입력/출력 인터페이스를 정렬해야합니까? 의견 작성자가 제안 했으므로 IDomainRepository<T>을 반환하도록 공장을 변경하십시오.

+0

나는 콘트라 또는 공분산의 사용법을 보지 못합니다. 그래서 당신은 왜 당신의 코드와 관련하여 그것에 대해 질문하고 있습니까? –

+0

대신'IDomainRepository '을 반환하십시오. – tia

답변

0

IBaseRepository repo = RepositoryFactory.Create(...); 
IDomainRepository<MyTask> domainRepo = repo as IDomainRepository<MyTask>; 
if (domainRepo != nil) 
{ 
    // domainRepo implements IDomainRepository<MyTask>. 
} 

그러나 다형성 (polymorphic)을 권장하지 않는 유형을 식별하기 위해 개체를 테스트 : 그렇지 않으면 인터페이스 포인터를 타입 변환하기 위해 as 연산자를 사용합니다.

도 참조하십시오. Test if object implements interface.