1

今、私は物事をよりスマートに行う方法を見つけようとしています. そうする過程で、私ができたのは、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 のコンストラクターに渡し、それを操作を実行するリポジトリとして使用することを意味します。これは機能しますが、まだ理想的ではないと思います。

したがって、私の質問は、これがこれを行う唯一の方法であるという点で正しいのでしょうか、それともこれを正しく理解していないのか、単に何かを見逃しているだけなのかということです。また、以前にこの問題に遭遇したことがある場合、この問題をどのように解決しましたか?

4

2 に答える 2

3

適切に聞こえるデコレータを使用する場合。各デコレーターには、IRepository の引数を持つコンストラクターがあり、装飾している内部リポジトリへの呼び出しの周りでロギングまたはトランザクション コードを呼び出します。

別の方法として検討することもできますが、私はアスペクト指向プログラミングの経験がほとんどありません。そのシナリオでは、使用するロギングまたはトランザクション メソッドを示す属性をクラスに適用します。ある時点で、これらのメソッドがコードに織り込まれます。これは、追加のコンパイル手順として、またはSpringFramework.netの場合はインジェクション時に行うことができます。

于 2009-01-13T16:59:26.190 に答える
1

さまざまな Get、Add、Update、Delete のロギングを処理し、それらを仮想化し、それらから継承する LoggingRepository 抽象基本クラスを作成できませんでしたか?

私はあなたがこれを試したかもしれないと思うので、あなたが解決しようとしている問題は何ですか?トランザクションでラップすることもできますが、おそらく NHibernateRepository でそれを行いたいと思うでしょう。

于 2009-01-13T16:55:45.963 に答える