2016-11-28 10 views
0

ジェネリックリポジトリでSimpleInjectorを実装する際に問題があります。ジェネリックリポジトリで単純インジェクタを実装する

私は、インターフェイスIRepository<T> where T : classと、インターフェイスを実装する抽象クラスabstract class Repository<C, T> : IRepository<T> where T : class where C : DbContextを持っています。最後に抽象クラスを継承するエンティティリポジトリがあります。ここでconcret例です:私のglobal.asax.csファイルで

public interface IRepository<T> where T : class 
{ 
    IQueryable<T> GetAll(); 
    IQueryable<T> FindBy(Expression<Func<T, bool>> predicate); 
    void Add(T entity); 
    void Remove(T entity); 
} 


public abstract class Repository<C, T> : IRepository<T> 
    where T : class where C : DbContext, new() 
{ 
    private C _context = new C(); 
    public C Context 
    { 
     get { return _context; } 
     set { _context = value; } 
    } 
    public virtual IQueryable<T> GetAll() 
    { 
     IQueryable<T> query = _context.Set<T>(); 
     return query; 
    } 
    ... 
} 

public class PortalRepository : Repository<SequoiaEntities, Portal> 
{ 
} 

、のApplication_Start()関数の下で、私が追加しました:私は私のプロジェクトを起動すると

Container container = new Container(); 
container.Register<IRepository<Portal>, Repository<SequoiaEntities, Portal>>(); 
container.Verify(); 

、シンプルなインジェクタは、コンテナを検証しようとし

追加情報:指定されたタイプRepository<SequoiaEntities, Portal>は具体的なタイプではありません。このタイプを登録するには、他のオーバーロードのいずれかを使用してください。

シンプルインジェクタを汎用クラスで実装する方法はありますか、特定のクラスを渡す必要がありますか?

+4

あなたは抽象的でないタイプを登録する必要があり、しかし最後のもの:PortalRepository:* container.Register 、PortalRepository>(); *抽象クラスの問題はインスタンス化できないことです。 – 3615

+0

@ 3615あなたはそれを答えとして入れるべきです – Nkosi

答えて

1

Register<TService, TImpementation>()メソッドでは、指定されたサービス(TService)が要求されたときにSimple Injectorによって作成される具体的なタイプ(TImplementation)を指定できます。ただし、指定された実装Repository<SequoiaEntities, Portal>abstractとマークされています。これにより、シンプルインジェクタはシンプルインジェクタを作成できません。抽象クラスを作成することはできません。 CLRはこれを許可していません。

具体的なタイプはPortalRepositoryですが、そのタイプを返すのはあなたの目標だと思います。

また
container.Register<IRepository<Portal>, PortalRepository>(); 

を、あなたはシンプルインジェクターの一括登録施設を利用し、1回の呼び出しですべてのあなたのリポジトリを登録することができます:あなたの構成は、したがって、次のようになります

Assembly[] assemblies = new[] { typeof(PortalRepository).Assembly }; 

container.Register(typeof(IRepository<>), assemblies); 
+0

2番目のケースでは、 'typeof(PortalRepository) 'はPortalRepositoryクラスのみですが、すべてのリポジトリを登録することについて話しますか? –

+0

@DervisFindikこの例は、 'PortalRepository'がどこにあるのと同じアセンブリ*内のすべてのリポジトリの登録を示しています。 – Steven

関連する問題