Возможна ли плохая практика в шаблоне 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.

Другие вопросы по тегам