5

誰かがこの「建築のジレンマ」を手伝ってくれないかと思っていたのですが、

投稿、ドキュメント、写真など、さまざまなタイプ(クラス)からいくつかのオブジェクトを取得しています

プレゼンテーション レイヤーでは、それらを 1 つのコンテナーにレンダリングする必要があることがわかりました。フォルダーがあり、内部にあらゆる種類のオブジェクトを持つことができる共有ポイント ライブラリの例を考えてみてください。

プロパティで並べ替えたい (PublishingDateTime としましょう)

それらを並べ替えたい場合、それらはすべて同じインターフェイスを実装する必要があることを知っているので、それらを次のように実装しました(ISortingCapableとしましょう)

さて、私のドメイン層では、インターフェースは問題ないように見えます。

しかし、その後、これらのインスタンス化されたオブジェクトが DTO としてプレゼンテーション層に移動した (それらはもはや同じドメイン オブジェクトではない) => DTO を MVC のビューのモデルと見なすため、それは役に立たないことに気付きました。

簡単に言えば:

プレゼンテーション層にある場合

List<PostDTO> 
List<PictureDTO> 
List<DocDTO> 

=> シンプルなオブジェクト、シンプルなレンダリング。

ここで、それらを 1 つのコンテンツ ストリームに並べ替えたいと思います。

私の質問は、DTO がまったく同じインターフェイスを再度実装する必要があるかどうかです。それとも、間違った側から問題を見ていますか?

4

1 に答える 1

0

ある時点でそれらをビューから再び分割するロジックが必要な場合、たとえば、独自のコントローラーに送られる個々のアイテムを表示したい場合は、それらを集約していくつかのナビゲーション プロパティを含めることもできます。

    public IEnumerable<StreamItem> GetStream() {
        var posts = (from post in postsDb
                     select new StreamItem() { ID = post.ID, Name = post.Name, Url = "Posts/Details/" });

        var docs = (from doc in docsDb
                    select new StreamItem() { ID = doc.ID, Name = doc.Name, Url = "Docs/Details/" });

        var stream = posts.Union(docs);

        return stream;
    }

    public class StreamItem {

        public string Url { get; set; }
        public int ID { get; set; }
        public string Name { get; set; }

    }

Mushin は正しいですが、それらのそれぞれは既に基本型 (私の場合はおそらく StreamItem) を事前に継承する必要があると言っています。

戻る途中でそれが何であるかを理解するために、ビュー側から Url (またはその他の識別子) が必要になるだけです。

MVC のデフォルト プロジェクトの AccountModels を見ると、User が DTO であり、多くの方法 (LoginModel、ForgotPasswordModel、RegisterModel) で操作されますが、常に DTO に戻ることがわかります。View から DAL を見たときに、物事が常に見えるとは限りません ;)

于 2013-04-30T17:00:50.767 に答える