我目前正在通过在我的'ViewModelProduct'对象的构造函数中注入一个Model对象,在WebApi中实现ViewModels,如下所示:

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; }
    }


在Controller中-以我为例,我想创建'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);
}

最佳答案

这不是一个坏习惯,实际上我一直在做,只是作为一种扩展方法(对于IProduct)。但是,在这种情况下,您真的需要工厂方法吗?仅做一个新的ViewModelProduct(product)就足够了。

您的其他选择虽然不是很好。这是一个视图模型,一个IProduct的DTO,使用DI容器是一种过大的手段,没有任何好处。顺便说一句,我认为视图模型不需要抽象。作为数据结构,它没有实际行为(最多有一些帮助者),这并不意味着您会有多种形式。

关于c# - Web API ViewModel模式中可能存在不良做法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20099755/

10-11 15:20