2

現在、次のように、「ViewModelProduct」オブジェクトのコンストラクターにモデル オブジェクトを挿入することで、WebApi 内に ViewModel を実装しています。

public class ViewModelProduct
{
    private IProduct _product;

    private int _ID;
    private string _name;

    public ViewModelProduct(IProduct product)
    {
        _product = product;

        ID = _product.ID;
        Name = _product.Name;
    }

    public int ID
    {
        set { _ID = _product.ID; }
        get { return _ID; }
    }

    public string Name
    {
        set { _name = value; }
        get { return _name;}
    }

    public string Description
    {
        set { _product.Description = value; }
        get { return _product.Description; }
    }

コントローラー内 - 私の場合は、'ViewModelProduct' のインスタンスを作成したい 'ProductController' です。可能な限り密結合を減らしたい。

BootStrapper クラスから Unity を使用して、「IFacade」オブジェクトをコントローラーのコンストラクターに挿入します。

ここでの本当の問題は、示されているように、モデルを送信してそのコンストラクター内に設定する「ViewModelProduct」オブジェクトの新しいインスタンスを単に返す静的メソッドを現在持っていることです。これは悪い習慣ですか?実行前にモデルがどうなるかわからないため、Unity でインスタンスを作成する方法を考えられません

public List<ViewModelProduct> GetProducts()
{
    var V2Ops = _facade.GetOperatorV2();

    var productList = V2Ops.GetProducts();

    List<ViewModelProduct> listObjects = new List<ViewModelProduct>();

    foreach (var product in productList)
    {
        //*****Setting a new instance from a static method.*****
        var viewModel = CreateNewViewModelV2.CreateViewModel(product);

        listObjects.Add(viewModel);
    }

    return listObjects;
}

新しい「ViewModelProduct」インスタンスを返す静的クラス:

public static ViewModelProduct CreateViewModel(IProduct passedProductModel)
{
    return new ViewModelProduct(passedProductModel);
}
4

2 に答える 2

1

それは悪い習慣ではありません。実際には常に行っていますが、拡張メソッドとして (IProduct 用)。しかし、この特定のケースでは、ファクトリ メソッドが本当に必要なのでしょうか? 新しい ViewModelProduct(product) を実行するだけで十分です。

ただし、他のオプションはあまり良くありません。これはビュー モデルであり、IProduct の DTO であり、DI コンテナーを使用するのはやり過ぎであり、メリットはありません。ところで、ビューモデルを抽象化する必要はないと思います。データ構造として実際の動作はありません (せいぜいいくつかのヘルパー)。複数のバリエーションがあるわけではありません。

于 2013-11-20T16:36:31.413 に答える
1

私がこれについて行った別の方法は、次のとおりです。

 public static IViewModelProduct CreateViewModel(IProduct passedProductModel)
    {
        var viewModelContainer = new UnityContainer();

        viewModelContainer.RegisterType<IViewModelProduct, ViewModelProduct>(new InjectionConstructor(passedProductModel));

        var newViewModelObject = viewModelContainer.Resolve<IViewModelProduct>();

        return newViewModelObject;
    }

Unity を使用して、インターフェイスの基本クラスからオブジェクトを構築するだけです。型の登録中に、渡された IProduct オブジェクトが新しい ViewModelProduct インスタンスのコンストラクターに設定されました。

于 2013-11-20T16:06:48.140 に答える