2017-10-09 18 views
1

私は次のように私の一般的なリポジトリのすべての実装を登録しようとしている:登録 - typeパラメータの不一致

container.Register(typeof(IRepository<>), new[] { typeof(Repository<>).Assembly }); 

しかし、コンテナは私の設定を確認することはできません。

追加情報:設定が無効です。 IErrorLogServiceタイプの インスタンスを作成できませんでした。 ErrorLogServiceのコンストラクターには、 'errorLogRepository'という名前のパラメーターが含まれています。 と入力してください。登録されていないIRepository < ErrorLog> IRepository < ErrorLog>が登録されていることを確認してください。 ErrorLogServiceのコンストラクタを変更してください。異なる タイプPersistence.Interfaces.Repository.Generic.IRepository < T> 要求されたタイプでありながら Persistence.Interfaces.Repository.Generic.IRepository < Persistence.DataModel.ErrorLog>の登録が存在することに留意されたいです。

various SO threadsに基づいて、上のスニペットが行くべき方法です。私は何を取りこぼしたか?

マイリポジトリクラス:

public class Repository<T> : IRepository<T> where T : Entity { } 

IRepositoryRepository同じアセンブリ内に存在します。

各タイプの明示的な登録が動作します:あなたは、そのマニュアルの状態を使用している

container.Register<IRepository<ErrorLog>, Repository<ErrorLog>>(); 
+0

さまざまなSOスレッドへのリンクをご提供ください。 – Enigmativity

+0

@Steven申し訳ありませんが、私のアップデートは助けましたか? – Johan

答えて

1

Register(Type openGenericServiceType, IEnumerable<Assembly> assemblies)過負荷:

レジスタすべてコンクリート、非ジェネリック、公共および内部種類コンテナの既定のライフスタイル(既定では一時的)を指定してopenGenericServiceTypeを実装する指定されたassembliesのセットに含まれます。

ここでは「非汎用」という単語に注意してください。このレジスタオーバーロードは、オープンジェネリックサービスタイプの非ジェネリックな実装をすべて一括登録するためのものです。あなたはオープンジェネリックの実装を1つ持っているので、このRegisterメソッドはそれを見つけられません。

代わりに、あなたは述べてRegister(Type serviceType, Type implementationType)過負荷、使用する必要があります。

レジスタの新しいインスタンスがserviceTypeが要求されるたびに返されることを。 serviceTypeimplementationTypeが同じタイプを表す場合、そのタイプは単独で登録されます。 オープンおよびクローズジェネリックタイプがサポートされています。

TLDR;

を次のように登録を変更し

container.Register(typeof(IRepository<>), typeof(Repository<>)); 

あなたはSimple Injector's documentationでこれについての詳細な情報を見つけることができます。