16

DIとコンストラクターインジェクションに次のジェネリックリポジトリインターフェイスを使用しようとしています。

public interface IRepository<TEntity> : IDisposable where TEntity : class

問題は、インターフェイスのインスタンスを定義するために、次のようなクラスタイプを提供する必要があることです。

private IRepository<Person> _personRepository;

これに関する問題は、DIを使用している場合(およびUnity for IoCフレームワークを使用している場合)、コンストラクターで複数のインスタンスを定義して、次のように操作する必要のあるすべてのリポジトリインターフェイスを取得する必要があります。

public MyClass(IRepository<Person> personRepository,
               IRepository<Orders> ordersRepository,
               IRepository<Items> itemsRepository,
               IRepository<Locations> locationsRepository)
{
  _personRepository = personRepository;
  _OrdersRepository = ordersRepository; 
  _itemsRepository = itemsRepository;
  _locationsRepository = locationsRepository;
}

質問:

  1. これでいい?
  2. そうでなければ、私はこの概念にどこで迷子になっていますか?
  3. これが適切であるとしても、インターフェイスを具象型に登録するUnityのポイントは何ですか?ジェネリックリポジトリが私に宣言を強制したので、私はすでにそれをしました。

私のためにこれを片付けるのを手伝ってください、そして私はあなたのすべての助けに感謝します!

4

5 に答える 5

11

D Stanley が指摘したように、依存関係は具体的なインターフェイスでなければなりません。そうでなければ、どこで T を宣言しますか? 従属クラスはジェネリックである可能性がありますが、ある時点で「T は人です」と言わなければなりません。

そうは言っても、Unity はジェネリック型の登録を非常にうまく処理します。

(または何でも)をラップするIRepository<T>ジェネリッククラスで実装するとしましょう。Repository<T>DbSet<T>

次に、次の登録と解決が機能します (コンストラクターへの注入が含まれます)。

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

// no specific registration needed for the specific type resolves
container.Resolve(<IRepository<Person>);
container.Resolve(<IRepository<Order>); 

タイプの特定のオーバーライドが必要な場合 (Items リポジトリは何らかの理由で特別であるため、完全に実装されたItemRepositoryクラスがあると言う)、一般的な実装の後にその特定の実装を登録するだけです。

container.RegisterType<IRepository<Item>, ItemRepository>();

解決IRespository<Item>すると、特定の実装が取得されます。

記録として、これはコードでのみ実行でき、構成ファイルでは実行できないと思います。誰かがその仮定を自由に修正してください。

于 2013-01-17T01:22:49.360 に答える
2

This seems ok except one missing point; you need UnitOfWork pattern to enable transactions. Without UnitOfWork pattern applied, all repositories try to commit db operations on different contexts.

于 2013-01-16T19:09:53.453 に答える
2

他のいくつかのサービスをバンドルする集約サービスの使用を検討することもできますが、MyClassやりすぎがないかどうかを注意深く確認する必要もあります。非常に多くの依存関係があることは、そのことを示している可能性があります。

于 2013-01-16T19:05:48.983 に答える
2

これでよろしいですか?

もちろん。あなたが持っているようなコンストラクター注入を使用するか、プロパティ注入を使用するかについては、個人的な好みがあります。コンストラクターに多くのパラメーターを指定する必要がないため、コンストラクター インジェクションはよりクリーンですが、より安全でもあります。

具体的な型へのインターフェイスを登録するUnityのポイントは何ですか

MyClass1 つの理由は、データベースにアクセスする実際のリポジトリを使用せずに単体テストできるようにするためです。リポジトリを「偽造」して、ハードコードされた値を返してテストすることができます。

于 2013-01-16T19:00:05.843 に答える