2015-02-05 2 views
1

일반적인 인터페이스 클래스의 인스턴스를 주입 형 FunctieModel의 저장소에 대한내가이 모델 클래스가

public interface IBaseRepo<T> where T : ObservableObject 
{ 
    void Delete(int id); 
    T GetItem(int id); 
    IEnumerable<T> GetList(); 
    bool Update(T model); 
    bool Insert(T model); 
} 

특정 인터페이스를

public interface IFunctieRepo : IBaseRepo<FunctieModel> 
{} 

내 Functie 모델 용 리포지토리 구현 :

주입해야하는 저장소와 함께 작동 할 수 있어야합니다개
public class FunctieRepoSql : IFunctieRepo 
{...} 

내 테스터 클래스 :

public class Tester  
{ 
    IBaseRepo<ObservableObject> repo; 

    public Tester(IBaseRepo<ObservableObject> repo) 
    { 
     this.repo = repo; 
    } 
} 

이 모두 잘 컴파일합니다. 이제 다른 저장소를 사용하여 테스터 클래스를 인스턴스화해야합니다.

new Tester(new FunctieRepoSql()) 

여기가 내 문제입니다. 이 오류는
FunctieRepoSql에서 나는 분명히 뭔가를 놓친 거지 IBaseRepo<ObservableObject>

로 변환 할 수 있습니다. 누구나 내가이 일을 어떻게 얻을 수 있는지 단서가있다?

+0

"C#의 분산"에 대한 기사를 찾고 있습니다. 예를 들어, 'IBaseRepo '와 같은 내용이 답이 될 수 있습니다. 좋은 자신을 잘하려고 시도 할 수도 있습니다 :) –

+0

그는'in'이 필요하고'in'은 필요하지 않습니다. –

+0

@Alexei, Preston, 아니 그는 그 둘을 필요로합니다. (반환 유형 및 메서드 매개 변수에서'T ') 따라서 분산은 도움이되지 않습니다. –

답변

0

두 가지 주요 옵션을 고려해야합니다. 가장 쉬운 방법은 Tester을 일반화하고 IBaseRepo<T>에 전달할 수있는 유형 매개 변수를 사용하는 것입니다. 이 기술을 사용할 수없는 어떤 이유로, 대신 다른 제네릭이 아닌 인터페이스를 만들 수 있다면 IBaseRepo<T>이 확장 IBaseRepo 것을

new Tester<FunctieModel>(new FunctieRepoSql()) 

:

public class Tester<T> where T : ObservableObject 
{ 
    IBaseRepo<T> repo; 

    public Tester(IBaseRepo<T> repo) 
    { 
     this.repo = repo; 
    } 
} 

는 그런 다음에 호출 코드를 변경할 수 있습니다. T을 사용하는 메소드의 경우 해당 메소드를 IBaseRepo<T>으로 표시해야하지만 해당 유형 인수를 사용하지 않고 선언하면됩니다. 이것은 IEnumerableIEnumerable<T>과 유사합니다. 이 작업을 완료하면 Tester을 일반 버전이 아닌 생성자에 IBaseRepo으로 사용할 수 있습니다.

+0

그게 전부예요. 테스터 클래스를 일반 것처럼 변경했습니다. 필요합니다. 당신과 다른 모든 사람들이 이것을 들여다 보는데 많은 감사를드립니다! –

1

IBaseRepo<FunctieModel>IBaseRepo<ObservableObject>으로 변환 할 수 없습니다. 예를 들어 cats라고하는 일반 콜렉션을 상상해보십시오. 동물 컬렉션으로 변환하면 강아지를 추가 할 수있어 바람직하지 않습니다. 그러나, 당신은 여기 out 키워드를 사용할 수 있습니다

public interface IBaseRepo<out T> where T : ObservableObject 

을하지만 당신은 입력 (msdn about out)로 ObservableObjects을 받아 들일 수 없습니다.

+0

당신이 맞을 때, 나는 그의 타입과 실제로 작동하지 않을 것이기 때문에이 대답이 얼마나 도움이되었는지 확실하지 않습니다. –

+1

@KirkWoll하지만이 응용 프로그램을 다시 디자인 할 수는 없으므로 작동하지 않을 것입니다 (그것에 관해서는 유용 할 것입니다). –