Возможна ли плохая практика в шаблоне Web API ViewModel?
В настоящее время я реализую ViewModels в моем WebApi, вводя объект 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; }
}
Внутри контроллера - в моем случае, "ProductController", я хочу создать экземпляр "ViewModelProduct". Я хочу уменьшить тесную связь, где это возможно.
Я внедряю объект IFacade в конструктор моего контроллера с помощью Unity из класса BootStrapper.
Настоящий вопрос здесь заключается в том, что у меня в настоящее время есть статический метод, просто возвращающий новый экземпляр объекта ViewModelProduct, который я отправляю в Model для установки в своем конструкторе, как показано. Это плохая практика? Я не могу думать, как я мог бы создать экземпляр с 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 ответа
Это неплохая практика, на самом деле я делаю это все время, но как метод расширения (для IProduct). Однако, в этом конкретном случае, вам действительно нужен фабричный метод? Достаточно просто сделать новый ViewModelProduct(продукт).
Ваш другой вариант, хотя и не совсем хороший. Это модель представления, DTO для IP-продукта, использование DI-контейнера является излишним и не имеет никаких преимуществ. Кстати, я не думаю, что модель представления должна быть абстрагирована. Поскольку структура данных не имеет реального поведения (в большинстве случаев некоторые помощники), это не значит, что у вас будет несколько вариантов этого.
Другой способ, которым я пошел об этом, заключается в следующем:
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.