NHibernate(または他のORM)を使用すると、DALの必要性がなくなりますか? そうでしょうか?NHibernateはDALを削除しますか?
答えて
あなたはDALが必要です。質問はDALで何をしているのですか?このプロジェクトでのみ.csファイルとマッピングファイル(.hbm.xml)
- MyProject.Core.DomainModelを使用します
- MyProject.Service:これらのクラスから、私はMyProject.Repoメソッドを呼び出します。
- MuProject.UI:ASP.NET、ASP.NET MVC、Winforms .....
- MyProject.Service.Tests:サービスをテストするすべての単体テスト
私は例を挙げて、私はすべてのアクティブな従業員を取得し、それらをソートしたいと思います。
私のUIでは、MyProject.Service.EmployeeService.GetActive();を呼び出します。 getGetActiveでは、PyProject.Repoの関数を呼び出してアクティブな従業員を取得します。結果が返ってきたら(サービスメソッドで)、私はLinqと注文し、注文したリストを返します。
レポ・プロジェクトを再開するには、NHibernateを介したアクセスDBにアクセスし、それがビジネスです。
それは私の意見ですが、それはこのようなものだ、私はそれはだ最善の方法、ない唯一の方法ではないかもしれないが、それは私のやり方です:)
私はこの質問に答える方法を考えようとしていましたが、答えはいいえ、そのDALの一部になるのではなく、DALの必要性を取り除くわけではありません。これはコードでsqlコードのビルドを呼び出すか、ストアドprocsを呼び出していました。
これはおそらく、複数のテーブルからのデータを持つBillビジネスオブジェクトを作成し、それを返していました。これは大変な労力を要し、通常は保守そのものが関わっていました。
NHibernateのは、だから、など
をこのタスクのうち、重い物を持ち上げる作業を要する(および他のものを行います)が、オブジェクトが返される前に、あなたはまだ操作を行うためのデータアクセス層の一部として、「マネージャー」のクラスをすることができ私はそれを説明するひどい仕事をしていますが、NHibernateはDALの必要性を取り除いておらず、DALが何を構成しているかを変えるだけです。
ザ・NHibernateはISession作業ユニットとシンプルとして使用することができますIRepository。この意味では、はであり、平凡なDALのものをいくつか置き換えることができます。例えば
:
using(var uow = new UnitOfWork())
{
var customerRepository = new Repository<Customer>(uow);
var customer = customerRepository.Get(id);
customer.DoSomething();
uow.commit();
}
は次のようになります。
明らかusing(var session = sessionFactory.OpenSession())
{
using(var tx = session.BeginTransaction())
{
var customer = session.Load<Customer>(id);
customer.DoSomething();
tx.commit();
}
}
あなたはまだISessionが何であるかを「知っている」ので、DALのアイデアを維持する理由があるユーザーを制御したいですあなたのコードで。しかし、あなたはUoWとリポジトリのコードを削除して、NHibernateに任せます。いくつかのものをぼかします。
ほとんどの人は、NHibernateでもIRepositoryを使用しています。それは議論の的題である。
主観はクエリの途中で続きます。リポジトリに特化したクエリメソッドを持つ方が好きな人もいます。他の人は、クエリを独自のオブジェクト(クエリオブジェクト)として持つことを好みます。正解か間違った答えはありません。