私は現在、特定のリポジトリごとに拡張されているインタフェース(IRepository<T>
)を持っています:IUserRepository : IRepository<User>
。構造体<T>をStructureMapの実装<T>に自動的に解決します(ジェネリックタイプTのみが異なる)
これらのインターフェイスのそれぞれには、対応する具体的なクラスがあります。UserRepository : Repository<User>, IUserRepository
です。
これらの個々のリポジトリは、追加の機能性を追加するものではありません。それらはすべて、ジェネリックスを渡すために単に使用される空のインターフェイス/クラスです。
IUserRepository
をUserRepository
に解決するために、StructureMapを使用して、アセンブリスキャナといくつかの命名規則でレジストリを使用します。
は、私は、これは代わりにIUserRepository
のインスタンスの周りに渡すと、それはUserRepository
に解決得ることの、私の周りIRepository<User>
を渡すことができ、それがRepository<User>
に解決されている方法より最適化された状態に移動したいと思います。
これにより、余分な空のインターフェイスとクラスを作成する必要がなくなります。
私はこの一般的なマッピングを設定するためにStructureMapの設定を使用する方法を考えることができません。このような何か:
For(typeof(IRepository<>).Use(typeof(Repository<>)).WithTheGenericTypeFromTheInterfaceSuppliedAsATypeParameter();
編集
回答の最初のカップルを取得した後、私はこのもう少し明確にしたいです。
設定のFor
ビットの個別のクラスを作成したくありません。私は自分のコードに次のクラス/インタフェースを持つようにしたい:
IRepository<T> where T : Entity
Repository<T> : IRepository<T> where T : Entity
Person : Entity
Product : Entity
Order : Entity
Whatever : Entity
そして大会で達成以下のマッピングがあります。
IRepository<Person> => Repository<Person>
IRepository<Product> => Repository<Product>
IRepository<Order> => Repository<Order>
IRepository<Whatever> => Repository<Whatever>
をしかし、私は、ALA、それぞれのマッピングを作成する必要がしたくないん:私はその意志単一のマッピングをしたい
For<IRepository<Person>>().Use<Repository<Person>>();
For<IRepository<Product>>().Use<Repository<Product>>();
For<IRepository<Order>>().Use<Repository<Order>>();
For<IRepository<Whatever>>().Use<Repository<Whatever>>();
すべてのIRepositoryのために働く:
For<IRepository<>>().Use<Repository<>>().WithTheSameGenericType();
私は、その後のサービスにリポジトリを注入するためにこれを使用します。
public MyService(IRepository<User> userRepository)
実行時にRepository<User>
に解決されると思います。
あなたの目的の構成が既に本当である:あなたのケースでは
、あなただけの最後で
に
を変更する必要があり、あなたのコンテナは、のようになります。 (WithTheGenericTypeFromTheInterfaceSuppliedAsATypeParameterの必要なしに)。あなたはそれを試してもそれは仕事をしませんでしたか? –
私は間違っていたに違いない - 最初はコンパイルされないので、私はジェネリック版のメソッドを使っていると思います。それらの朝のひとつ。 –