나는 내 설계에서 공분산/반공립 문제라고 생각하는 것을 고민하고있다. 내가 런타임에 알려진 유일한 일반적인 개체를 반환 싶어요.이것은 내 설계와 공분산/반공립성 문제입니까?
나는 다음의 클래스/인터페이스가
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>
을 반환하도록 공장을 변경하십시오.
나는 콘트라 또는 공분산의 사용법을 보지 못합니다. 그래서 당신은 왜 당신의 코드와 관련하여 그것에 대해 질문하고 있습니까? –
대신'IDomainRepository'을 반환하십시오. –
tia