EFとPOCO + WCF + WPF。クライアント上でPOCOクラスを再利用するかDTOを使用しますか?

WPFクライアントを使用してWCFを介してBLLと通信する3層アプリケーションを開発しています。 EFを使用してデータベースにアクセスします。 私たちはEFのデフォルトEntityObjectコードジェネレーターを使用していましたが、ワイヤを介してオブジェクトを送信したり、BLLでそれらを処理して再接続するときに、多くの問題やシリアル化の問題がありました。

私たちはPOCOテンプレートに切り替えようとしており、データアクセスとアプリケーションの通信部分を書き直しています(より洗練されたアーキテクチャーとそれほど魔法のコードがないことを望んでいます)。

クライアント側でPOCOクラスを再利用することをお勧めしますか?あるいは、別々のDTOクラスを作成する必要がありますか?彼らがPOCOエンティティクラスと同一であっても? 2つのアプローチの長所と短所は何ですか?

3
あなたは "関連"の質問のいくつかをチェックしましたか?以前はこの話題について多くの議論がありました。 stackoverflow.com/questions/725348/poco-vs-dto stackoverflow.com/questions/3779508/…
追加された 著者 InSane,
この回答を確認して、EFエンティティの依存関係をDALより上のレイヤに持たないようにする方法についても調べてください。 stackoverflow.com/questions/7474267/mvc3-and-entity-framewor‌ k /…
追加された 著者 Davide Piras,

3 答え

間違いなくDTOs + AutoMapperを使用してください。それ以外の場合は、循環依存(特にナビゲーションプロパティに問題がある)のためにWCFを使用している間に、DataContractSerializerに問題があります。最初にDTOを省略することはできますが、上記の問題のために後でDTOを使用する必要があります。だから私は、各層に適切なDTOを使用してアドバイスをします。

また、ティア固有のモデルには異なる属性が含まれます。また、各階層で実行するデータを変更(つまり、専門化)する必要があるかもしれません。したがって、あなたのプロジェクトが十分に大きい場合(あるいはその可能性がある場合)、DTOを適切な名前で使用し、適切な場所に配置します(つまり、同じアセンブリ内のすべてではありません)。

3
追加された
私の場合、DTOクラスがPOCOクラスと同じであっても、これはあなたのアドバイスですか?だから、基本的に私は、POCOからDTOを生成するためのT4テンプレートを作成することによって、アプリケーションの開発を開始します。
追加された 著者 Mark Vincze,
はい、それはプロジェクトが大きくなるにつれて頭痛のトンからあなたを保存するので、私のアドバイスです。また、AutoMapperを使用すると、すべての手動マッピングの手間を省くことができます。あなたがDataContractSerializerの知識に非常に自信があるなら、あなたはPOCOを使用することができますが、多くの調整が必要です。
追加された 著者 Teoman Soygul,

今私は同様の問題に取り組んでいます。私は次にやった:

  1. 次のassemplitiesを作成する:

SF.Contracts - ServiceCotnractsとDataContractsを定義したばかりです。明らかにすべてのdatacontractsはEFのPOCOクラスのように使用できます(しかし、私はt4や他のジェネレータを使用しません - すべてのPOCOクラスとDataContextはマニュアルで書かれています。/7886285/ef4-navigationproperty-and-join-a-bug-or-a-feature ">悪いデータベース)を参照してください。 SF。

SF.DataAccessObjects - このassemlityで私は私のedmxとDataContextを実装しています。 SF.Services - WCFサービスの実装。

だから、多数のWCF選択メソッドが次の署名と実装を持っています:

        public List VulnerSelect(int[] idList = null, string[] navigationPropertiesList = null)
    {
        var query = from vulner in _businessModel.DataModel.VulnerSet
                    select vulner;

        if (navigationPropertiesList != null)
            navigationPropertiesList.Select(p =>{query = ((ObjectQuery)query).Include(p);
                                   return true; });
        if (idList != null)
            query = query.Where(p => idList.Contains(p.Id));

        return query.ToList();
    }

次のようにこのメソッドを使用することができます:

WCFproxy.VulnerSelect(new[]{1,2,3},new[]{"SecurityObjects", "SecurityObjrcts.Problem"});

あなたはserrialization、ナビゲーションプロパティなどに問題はなく、どのNavigationPropertiesをロードする必要があるかを明確に示すことができます。

p.s .:私の悪い英語のためのソーリー:)

2
追加された
答えをありがとう。この例では、VulnerクラスはWCFを経由するDTOとEFが管理するエンティティクラスの両方です。
追加された 著者 Mark Vincze,
はい?その通り。 EDMPは私のVulnreTableをDBからこのPOCOクラスにマップし、そのクラスはWCFサービスでDataContractのように使用されました。
追加された 著者 Sergey Shulik,

DTOを使うといいでしょう。

循環依存性およびラージオブジェクトグラフは、エラーまたはシリアル化されたトラフィックのあまりに多くを引き起こす深刻な問題になります。 ORMで制御されたオブジェクトには、あまりにも多くのノイズがあり、それを回線に送ることができます。

サービスオブジェクトを使用してドメインオブジェクトにアクセスし、LINQを広範囲に使用しますが、私は常にDTOオブジェクトをクライアントに返します。

1
追加された