Web API ViewModel模式中可能存在的不良做法?

时间:2013-11-20 15:17:00

标签: c# asp.net-web-api asp.net-mvc-viewmodel view-model-pattern

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

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中 - 在我的情况下,'ProductController'我想创建'ViewModelProduct'的实例。我希望尽可能减少紧密耦合。

我通过在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);
}

2 个答案:

答案 0 :(得分: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实例的构造函数。

答案 1 :(得分:1)

实践并不差,我实际上是一直这样做,但作为扩展方法(对于IProduct)。但是,在这种特殊情况下,您真的需要工厂方法吗?只是做一个新的ViewModelProduct(产品)就足够了。

你的另一个选择并不是很好。它是一个视图模型,一个IP产品的DTO,使用DI容器是过度杀戮而且没有任何好处。顺便说一句,我不认为viewmodel需要抽象。作为数据结构,它没有真正的行为(最多是一些帮助者),它不像你会有多种变体。