3

私たちのページの多くは、基本的に NHibernate マップされたエンティティのカットバック バージョンであるカスタム ビュー モデルを使用しています。

エンティティのグローバル セットがある場合、ロジックをエンティティに追加できるため、エンティティ中心のビジネス ロジックの小さな部分を再利用するのは簡単です。ただし、ビュー固有のビュー モデルがあると、これは難しくなります。

これは不自然な例です:

// Entity
public class Sale : Entity
{
    public Guid Id { get; set; }
    public decimal Tax { get; set; }
    public decimal SalePrice { get; set; }
    public int TotalPrice
    {
        get { return Tax + SalePrice; }
    }
    ... more properties ...
}

// View model
public class SaleView
{
    public Guid Id { get; set; }
    public decimal Tax { get; set; }
    public decimal SalePrice { get; set; }
}

public class Controller
{
    public Action ViewSale(Guid id)
    {
        return Session.Query<Sale>()
            .Where(x => x.Id == id)
            .Select(x => new SaleView
                {
                    Id = x.Id,
                    Tax = x.Tax,
                    SalePrice = x.SalePrice
                });
    }
}

この例では、エンティティで現在実行されている "TotalPrice" 計算を再利用するためにどのような戦略を使用しますか?

「TotalPrice」をどこかで静的メソッドにして、税と販売価格をパラメーターとして受け入れるようにすることもできますが、これは、特にプロパティの数とプロパティ間の関係が大きくなるにつれて、非常に醜く柔軟性のないコードになる可能性があります。別の「TotalPriceCalculator」クラスを作成することもできますが、ViewModel を処理するには、エンティティとビュー モデルの両方が実装するインターフェイスを受け入れる必要があります。これにより、各プロパティを 3 回書き出す必要があるため、重複したコードが急増する可能性があります。他に何ができますか?

4

1 に答える 1