私のViewModelsコンストラクタにDTOを渡してプロパティをマップする

architecture asp.net-mvc c# dapper

質問

私のソリューションでは2つのプロジェクトがあります。

プロジェクト1(コア)Dapperを使用したSQLからDTOへのマッピング

プロジェクト2(WebUI - ASP.NET MVC 4)ここで私はビューごとにViewModelを使用します。

コントローラの例

  [HttpGet]
    public ActionResult Edit(int id)
    {
        // Get my ProductDto in Core
        var product = Using<ProductService>().Single(id);
        var vm = new ProductFormModel(product);

        return View(vm);
    }

ViewModelの例

public class ProductFormModel : BaseViewModel, ICreateProductCommand
    {
        public int ProductId { get; set; }
        public int ProductGroupId { get; set; }
        public string ArtNo { get; set; }
        public bool IsDefault { get; set; }
        public string Description { get; set; }
        public string Specification { get; set; }
        public string Unit { get; set; }
        public string Account { get; set; }
        public decimal NetPrice { get; set; }

        public ProductFormModel(int productGroupId)
        {
            this.ProductGroupId = productGroupId;
        }

        public ProductFormModel(ProductDto dto)
        {
            this.ProductId = dto.ProductId;
            this.ProductGroupId = dto.ProductGroupId;
            this.ArtNo = dto.ArtNo;
            this.IsDefault = dto.IsDefault;
            this.Description = dto.Description;
            this.Specification = dto.Specification;
            this.Unit = dto.Unit;
            this.Account = dto.Account;
            this.NetPrice = dto.NetPrice;
        }

        public ProductFormModel()
        {
        }
    }

説明:プロジェクト(コア)のサービスクラスを使用して、私のコントローラにDTOを取得します。次に、ViewModelを作成し、ViewModelのコンストラクタにDTOを渡します。私のViewModelは空のコンストラクタを取ることができるので、このビューを使って新しいProductを追加することもできます。

誰もこれの経験を持っていますか?プロジェクトが大きくなるにつれ、私はこのようにして将来的に問題を抱えるのではないかと思いますか?

私はこれがDapperとは何の関係もないことを知っています。しかし、私はまだ私の解決策を説明する良い方法が好きです。

受け入れられた回答

私はあなたの現在のアプローチを使ってうまくいくと思います。さらに重要なのは、オブジェクトマッピングコードに関連する問題に遭遇した場合(あまり事前に考えすぎるのではなく)、これとリファクタリングのように始めてください。

時々使用するマッピングロジックを整理するもう1つの方法は、拡張メソッドを使用することです。このようにして、マッピングコードはビューモデル自体とは別に保持されます。何かのようなもの:

public static class ProductMappingExtensions
{
    public static ProductFormModel ToViewModel(this ProductDto dto)
    {
        // Mapping code goes here
    }
}

// Usage:

var viewModel = dto.ToViewModel();

さらに別のアプローチは、 AutoMapperのようなマッピングフレームワークを使用すること です - マッピングロジックが単純な場合(特にプロパティ間で1:1マッピングが多い場合)、これは特に適しています。

しかし、再び、 必要なときに簡単でリファクタリングを開始します。


人気のある回答

私はこれがちょっと遅い答えであることを理解していますが、将来誰かを助けるでしょう。

このようにオブジェクト間のマッピングを行う方法は、SOLIDの原則の「S」を破ります。なぜなら、ViewModelの責任は、そのプロパティのデータをビューで使用できるように準備することであり、それ以外は何もしないため、それは責任です。

この方法のもう一つの欠点は、ViewModelがあなたのDTOと強く結びついているように、 'Loose Coupling' OO原則を破るということです。

私たちがプロジェクトの最初のステップに入っているときでも、私たちが決して破ってはならないいくつかのimportantオブジェクト指向の原則があるので、自動(AutoMapper、ValueInjecter ...)またはマニュアルのマッパークラスを使うことは間違いありません。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ