今、私は物事をよりスマートに行う方法を見つけようとしています. そうする過程で、私ができたのは、1日でフルボトルのエクセドリンを使用することだけです.
IRepository というインターフェイスがあるとします。
public interface IRepository<T>
{
T Get(int id);
void Add(T value);
void Update(T value);
void Delete(T value);
...
}
そして、私は次のような実装を持っていると仮定します
public class NHibernateRepository<T>
{
...
}
さて、すべて問題ありません。リポジトリに対してすべての基本操作を実行して、すべての CRUD 機能をサポートできますが、特殊な操作が必要な場合があるため、次のようなインターフェイスがあると仮定します。
public interface IUserRepository : IRepository<User>
{
IList<User> GetUsersByRole(Role role);
}
そして、そのような実装:
public class UserRepository : NHibernateRepository<User>, IUserRepository
{
....
}
オーケー、これで基本的なセットアップは完了です。次に、やりたいことがもう 1 つあります。ロギングやトランザクションなどをすべて透過的にしたいと考えています。そこで、Castle Windsor や StructureMap などの依存性注入フレームワークを使用して、IRepository を要求すると、LoggingRepository と TransactionRepository によってラップされるようにします。どちらも IRepository を実装しています。
だから、私がやりたいことは次のようなものです:
IUserRepository repository = container.Resolve< IUserRepository>();
Logging および Transaction デコレーターにラップされたユーザー リポジトリを返すようにしますが、これが機能する方法が思い浮かびません。これを機能させると考えることができる唯一の方法は、次のように UserRepository を実装することです。
public class UserRepository : DecoratorRepository<T>, IUserRepository
{
protected IRepository<T> Repository { get; set; }
public UserRepository(IRepository<T> innerRepository)
{
Repository = innerRepository;
}
}
これは、依存性注入を使用して装飾されたリポジトリを作成し、それを UserRepository のコンストラクターに渡し、それを操作を実行するリポジトリとして使用することを意味します。これは機能しますが、まだ理想的ではないと思います。
したがって、私の質問は、これがこれを行う唯一の方法であるという点で正しいのでしょうか、それともこれを正しく理解していないのか、単に何かを見逃しているだけなのかということです。また、以前にこの問題に遭遇したことがある場合、この問題をどのように解決しましたか?