2011-02-01 9 views
2

実際には何かPOCOは、の依存関係を意味しますか?POCO;永続性無視とDAL依存性(NHibernate)

NHibernateを使用。子コレクションは、NHibernate.Collection.Generic.PersistentGenericBag <>として取得されます。これは私がここで "依存関係"を意味するものです。私がオブジェクトグラフを保存/更新しようとすると、DALはすでにそれを維持しようとしていることについて、それについての "意見"を持っています。

当初、私はPOCOを要求する(この観点では正しい用語が何であるかわからない)DAL、リポジトリ、ORM なしdepencenciesを運ぶだろうと思いました。しかし今私は混乱しています。私はおそらくPOCOクラスにはの永続性メソッドがないことを意味していると考えています。;そして、POCOオブジェクトグラフを取得することは依然としてそのような依存関係を運ぶことができますか?

あなたがPOCOについて話すとき、あなたはどういう意味ですか? POCOはこれらのタイプの依存関係を持つことができますか?場合は、そうでないかもしれません。どのように「名前で」それらを区別しますか?

「依存性のない」POCOは、ある点ではDTOのよ​​うに見えますが、動作する可能性があるため、結局DTOではありません。

また、ちょうど100%確実であること:私はDTOが無知で永続的であり、「依存性がない」と仮定します。

おそらく "依存関係"は正しい単語ではないので、正しい場合は私にしてください。私の質問はまだ分かりやすいと思う。


EDIT1:さらにいくつかの思考で

。たぶん、私の仮定は... PersistentGenericBagはそれにいくつかの "依存関係"が間違っています(?)恐らくそれは単なる型であり、何も魔法ではありません。そしてさらに;オブジェクトがNHに持つ唯一の依存関係は、ISessionsを介しているということです。もちろん、これは私たちが制御できます。それは理にかなっていますか?

答えて

1

POCOは、フレームワークやその他のインフラストラクチャクラスに依存しないクラスです。さて、NHibernateはPersistentGenericBagを使用しますが、あなたのPOCOはIListクラスを参照するだけです。あなたのPOCOのために

、このインスタンスはListReadOnlyListまたはPersistentGenericBagになる場合、それは問題でdoes't、彼はIListとして扱いますが、対処まで彼にはない他の行動を持つことになります。

ちなみに、アノテーションを使用してドメインオブジェクトをマッピングする場合は、ORMに明確な依存関係があります。

+0

乾杯!私はFluentNHとマッピングしています。私はそれが類似したタイプのリストであるというあなたの主張を見ます。しかし、NHibernateが特定のことに嫌なので、CRUD操作を「どのように」実行するかに注意を払う必要があるようです。しかし、これはまだ分かりませんが、私はこのようなCRUD例外を使って作業しています。 – bretddog

1

「DAL」に関してあなたのオブジェクトに依存していないことは、かなりのユートピアです。 しかし、NHibernateがそれを解決する方法は、非常に近いIMHOになります。

IMHOという用語は、あなたのエンティティ(ドメインオブジェクト)が特定の基本クラスから継承する必要がないこと、またはDALが機能するためのインターフェイスを実装する必要がないことを意味します。
これはNHibernateのケースです。しかし、実際にNHibernateはコレクション(Iese.Setクラスのような)にいくつかの余分なクラスを必要としますが、これは主に.NETフレームワークがその時点で 'Set'クラスを持たないためです。
NHibernateは独自のコレクションクラスを使用していますが、ほとんどの場合、開発者はそれに悩まされません。

ドメイン駆動設計の原則に従うと、あなたのエンティティはPOCOになることができますが、あなたのエンティティは確かにDTOだけではありません。エンティティは、そのエンティティがどのように現実世界でデータと振る舞いを持つように見えるかを表現するものでなければなりません。

DTOは、レイヤ間でデータを転送するために使用できるオブジェクトであるため、実際には無知にしておく必要があります。2つのレイヤーのうちの1つは、DALである必要はありません。たとえば、DTOを使用して、ビジネスレイヤーからビューレイヤーにデータを転送することができます。

+0

リストは本当に透過的です。私は通常、すべてのコレクションにIListを使用します。 nhibernateはそれが好きな実装を使うことができます。私のコードは本当に気にしません。私が見ているように私のPOCOには依存していません。 – jgauffin

+0

ありがとう!私が思ったのは、DTO(NHibernate-> DTO-> BusinessPOCO)を使うとき、POCOは設計上、「依存関係がない」ということでした。 NHibernate-> BusinessPOCOを使用している場合、POCOは依存関係を持つ可能性があります(?)。私は5月に次のように(?)を書いています:それは "必要"なのですか、私は自分のリポジトリを書く方法でこれを "簡単に"決めることができますか? – bretddog

+0

@jgauffin:IListとISetの間に意味の違いがあることに注意してください。 nHibernateはそれらを別々に扱います。 –