2009-10-07 9 views
5

私はNHibernate(およびORMS)の新機能であり、さまざまなオプションが用意されています。参考までに、Fluent NHibernateを別々のビジネスオブジェクトと共に使用しています。これは純粋にDTOをデータアクセスに使用しています。私のアプリケーションアーキテクチャは、ウィンドウとウェブの両方のフロントエンドをサポートしなければなりません。NHibernate DTOを構築するための最善のアプローチ

非常に多くのオプションがあるように私の過度のアプローチは一般的なアプローチの1つです。私のDTOは以下のサンプルのように見えます。各DTOには、BOから渡されるISessionへの参照があります。彼らは、自分の負荷を担当して保存:すべての

public class EmployeeDTO... 

    // Data Properties to be persisted to the database 
    public virtual int Id { get; private set; } 
    public virtual string FirstName { get; set; } 
    public virtual string LastName { get; set; } 
    public virtual ISession Session { get; set; } 

    // Save logic 
    public virtual void Save() 
    { 
     var transaction = Session.BeginTransaction(); 
     Session.SaveOrUpdate(this); 
     transaction.Commit(); 
    } 

    // Load logic 
    public virtual void Load(int id)... 

まず: これは取るべき正しいアプローチです - DTOを保存し、自分自身をロードする能力を持っている必要がありますか?

第二: は関係なく、セーブ/ロード・コードがどこにあるの、あなたは一生またはオブジェクトに対して同じISessionを使用する必要があります、または彼らはISessionFactoryへの参照を持っているし、新しいセッションたびにデータベースとの対話を開く必要があります必要とされている?もちろん

// Open a new session every time I interact with the repository 
    var session = FluentSupport.SessionFactory.OpenSession(); 
    var transaction = Session.BeginTransaction(); 
    Session.SaveOrUpdate(this); 
    transaction.Commit(); 
    session.Close(); 
    // Close the session when I'm done 

は常にオプション3、のDTOは(セーブ、ロードなど)の挙動を含んでいないと、彼らは持続し得る方法の知識が含まれていない、一般的には

+0

オブジェクトが自身を保存する方法を知っているDAOと呼ばれ、これはarchitecureは、ウェブ(シルバー)およびWindows(WPF)の両方をサポートする必要があるDTO –

答えて

10

:)上記のいずれも(ISessionがあります)。あなたが実際に作成しているものがデータレイヤーのように聞こえます。あなたのビジネス層は、理想的には、セッションについても知ってはいけません。つまり、必要に応じてこのレイヤーをすべてショートカットすることができますが、ORMがすべてのレイヤーを通過すると、後で別のORMに変更することは難しいでしょう。

ISessionライフタイム管理の場合、基本的にすべてのユーザー要求が新しいISessionを取得するというUnitOfWorkパターンを使用するかどうかを決定する必要があります。 ISessionのライフタイムには他にもオプションがありますが、実際にはこれに限定されません。多くの場合、WebアプリとWindowsアプリ、他のアプリケーションの種類のベストプラクティスがあるかもしれませんが、あなたが書いているものを指定していません。

+0

とは何の関係もない – Steve

+0

私はこれをカバーするために質問を明らかにしました。 .. – Steve

2

ISessionは非常に安価で開閉できます。長すぎる状態にしておくことの問題は、接続プールがタイムアウトするまで接続を再利用できないことです。これは、マルチユーザーアプリケーションでは問題になる可能性があります。

あなたのシナリオでは、私はたぶん、サービス指向のアプローチが検索データを格納するために行くだろう。つまり、DTOはサービス境界内でのみ内部的に使用されます。同じように見えるオブジェクトをコピーする必要がある場合は、この特定の目的のために作成されたAutoMapperをご覧ください。あなただけの窓またはウェブのみのプロジェクトがある場合、それは問題ではありません。それはあなたがミックスする時です。 Webアプリケーションと同じようにWindowsアプリケーションでセッションを処理することはできません。

9

あなたのDTOとは別のコードをロード/保存しておいてください。 DTOオブジェクトは、基礎となるデータのビューのみです。

クエリを実行するときは、変換を使用してDTOを返します。このようなもの:

resultSet = session.CreateCriteria(typeof(MyDataObject)) 
    .Add(query criteria, etc.) 
    .SetResultTransformer(Transformers.AliasToBean<MyDTOObject>()) 
    .List<IMyDTOObject>()
+0

(ドメインプロパティをDTOプロパティにリンクする)Addメソッドではどの基準を使用できますか? –

+0

@SilvioDelgado:申し訳ありませんが、私は3年以上でNHibernateで作業していないので、わかりません。 –

+0

問題ありません。とにかくありがとうございました。 :) –

3

DTOは「データ転送オブジェクト」を意味します。つまり、システム内で値または値のコレクションを渡すために使用されるダムオブジェクトです。彼らは自分自身を永続させる責任を負うべきではなく、ドメイン層のドメインオブジェクトに1-1をマッピングするべきです。

関連する問題