我目前正在我的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);
}
答案 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需要抽象。作为数据结构,它没有真正的行为(最多是一些帮助者),它不像你会有多种变体。