次のように、他のコントラクトが拡張するベースリポジトリコントラクトがあります
public interface IBaseRepository<T> where T : class
{
IList<T> GetContents();
}
そしてそれを次のように拡張する他の契約があります
public interface IRepository1 : IBaseRepository<MyClass1>
{
}
public interface IRepository2 : IBaseRepository<MyClass2>
{
}
IRepository1を次のように実装します
public class Repository1 : IRepository1
{
public IList<MyClass1> GetContents()
{
//some code goes here
}
}
IRepository2についても同様です
public class Repository2 : IRepository2
{
public IList<MyClass2> GetContents()
{
//some code goes here
}
}
今、私は次のようにIServiceを実装するサービスService1を持っています
public class Service1 : IService
{
}
ここでサービスコンストラクターでベースリポジトリ(IBaseRepository)を使用し、このベースリポジトリのインスタンスを取得して、次のように使用します。
public class Service1 : IService
{
private IBaseRepository<T> _baseRepository;
public Service1(IBaseRepository<T> baseRepository)
{
_baseRepository = baseRepository;
}
public MyMethod1()
{
var contentsOfType1 = _baseRepository<MyClass1>.GetContents();
}
public MyMethod1()
{
var contentsOfType2 = _baseRepository<MyClass2>.GetContents();
}
}
これは私ができないことです。
したがって、タイプTの汎用ベースリポジトリコントラクトがあり、ベースコントラクトを拡張し、タイプTを指定する他のコントラクト(インターフェイス)があります。
これらすべてのコントラクト(ジェネリックベースコントラクトを拡張する)には、個別の実装があります。
私がやりたいのは、サービスクラスで、このジェネリック基本コントラクトをインスタンス化し、それを使用して拡張タイプ(したがって実装)を推測し、基本リポジトリのメソッドを使用することです。
したがって、基本契約が
IBaseRepository<T>
延長契約は
IRepository1 : IBaseRepository<MyClass1>
これはによって実装されます
Repository1 : IRepository1
私はこれを私のサービスクラスで使用したい
public class service()
{
*private IBaseRepository<T> _repo;
public service(IBaseRepository<T> repo)
{
*_repo = repo;
}
public void MyMethod()
{
*var x = _repo<MyClass1>.MethodFromIBaseRepository()
}
}
ですから、私が達成したい*マークの付いた線は、私にはできません。
DIにはキャッスルウィンザーを使用しています。
助けてくれてありがとう