5

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

プロジェクト 1 (コア) Dapper を使用して SQL を DTO にマッピングする

プロジェクト 2 (WebUI - ASP.NET MVC 4) ここでは、View ごとに 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 を作成し、DTO を ViewModel のコンストラクターに渡します。ViewModel は空のコンストラクターを使用できるため、このビューを使用して新しい製品を追加することもできます。

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

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

4

2 に答える 2

10

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

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

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

// Usage:

var viewModel = dto.ToViewModel();

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

ただし、必要に応じて簡単にリファクタリングを開始してください

于 2013-01-14T11:37:55.853 に答える
1

これは少し遅い答えだと思いますが、将来誰かに役立つかもしれません。

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

この方法のもう 1 つの欠点は、ViewModel が DTO と強く結合されているため、「疎結合」の OO 原則にも違反することです。

プロジェクトの最初のステップであっても、決して破ってはならないいくつかの重要な OO 原則があると思います。そのため、自動 (AutoMapper、ValueInjecter ...) または手動のいずれかのマッパー クラスを使用する方が間違いなく優れています。

于 2016-12-28T10:55:09.763 に答える