我目前正在 WebApi 中实现 ViewModel,方法是将 Model 对象注入(inject)到“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”对象注入(inject)到 Controller 的构造函数中。
这里真正的问题是我目前有一个静态方法,仅返回“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) 就足够了。
你的其他选择虽然不太好。它是一个 View 模型,一个 IProduct 的 DTO,使用 DI 容器太过分了,而且没有任何好处。顺便说一句,我认为 View 模型不需要被抽象。作为数据结构,它没有真正的行为(最多有一些助手),所以您不会有它的多种变体。
关于c# - Web API ViewModel 模式中可能存在不良实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20099755/