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

简单地使用统一从接口基类构造一个对象。在注册类型时,传递的 IProduct 对象已设置为新 ViewModelProduct 实例的构造函数。

于 2013-11-20T16:06:48.140 回答