1

Repository pattern,UoW patternの使用については多くの議論があります。私はいつ、そしてなぜRepository patternが使用されるのかをよく理解しています。 私はいくつかの集約の根を持っているとしましょう。次は何ですか?どのようなパターン/実装が好きですか?単純なNHibernate Sessionより複雑なソリューションを使用する理由は何ですか?リポジトリパターン、UoWパターン、プレーンHibernateセッション

ありがとうございます!

答えて

5

リポジトリパターンは不要ではない-imho-れる抽象化です。これにより、システム全体で複数回使用できる特定のクエリを事前定義することができ、読みやすさが向上します。

リポジトリは作業単位(NHibernateのISessionによって既に実装されています)を使用します。それは私の視点です。

私は何をしますか、あなたのプロジェクトのNHibernateのセッションにいくつかの拡張メソッドを作成しています。これは次のようになります。

public class ISessionExtensions 
{ 
    public static IEmployeeRepository GetEmployeeRepository(this ISession session) 
    { 
     return new EmployeeRepository(session); 
    } 
} 

public class EmployeeRepository() 
{ 
    internal EmployeeRepository(ISession s) 
    { 
    } 

    public IEnumerable<Employee> GetEmployeesFromDepartment(Department d) 
    { 
     ... 
    } 
} 

次に、あなたのコードでは、あなたがこれを行うことができます:

using(ISession s = _sessionFactory.OpenSession()) 
{ 
    var repository = s.GetEmployeeRepository(); 
    ... 
} 
+0

興味深いです。しかし、それはあなたのアプリのサイズが合理的であれば、nhibernateセッションの拡張を実際に生成します。読みやすさのためにはどうですか? Nhsessionは神のクラスになる? – Hace

+0

多くの拡張機能を生成するのはなぜですか?合理的なサイズのシステムであっても、拡張メソッドの数はそれほど大きくないと思います。その次に、拡張メソッドが複雑であるということではありません。私は、彼らが、すでにそれよりも、エスセッションをより神のクラスにするとは思わない。 –

+0

私は、すべてのリポジトリの拡張子をすべてのルート集合体として作成するつもりだと思っていました。 Isessionを言った+1はすでに神のクラスです;-) – Hace

3

リポジトリパターンはNHibernateより前です。今では、ほとんどの場合、不要な抽象化であるNHibernateの上にリポジトリパターンを適用します。 NHibernate上の抽象レイヤーとしてのジェネリックリポジトリの背後にあるアイデアは、ある時点でEntity Frameworkのような他の永続化メカニズムに切り替えることができるということです。本当に?それは可能ですか?私はキャッシング、フェッチなどのような多くのNHの仕様で終わるので、私は思っていません。私にとっては、プレーンなセッションの使用はOKです。

Here ayende talks about that for a while

And more...