Re: Самоинициализирующийся ViewModel
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 03.12.10 08:53
Оценка: 4 (1)
Здравствуйте, michael_isu, Вы писали:

_>Всем привет.


_>Вопрос несколько специфичный для asp.net mvc, но решил задать его тут, т.к. концептуальности в нем кажется больше.


_>Вот первый вариант реализации экшена:


_>
_>public class CompanyController : BaseController
_>{    
_>    public ActionResult ProductList(ProductListRequest request)
_>        {
_>            request.Company = Company;
_>            return View("products/list", new ProductListModel(request));
_>        }
_>}
_>


_>Где ProductListModel:


_>
_>public class ProductListModel
_>    {
_>        public ProductListModel(ProductListRequest request)
_>        {
_>            Contract.Requires(request != null);

_>            Request = request;

_>            Products = Repositories.Products.Select(request.Company, request.ProductTypes);

_>            ProductTypes = Repositories.ProductTypes.Select(request.Company.Evaluate(v => v.Speciality));
_>        } 

_>        #endregion

_>        #region Instance Properties

_>        public ProductListRequest Request { get; private set; }
_>        public IEnumerable<Product> Products { get; private set; }
_>        public IEnumerable<ProductType> ProductTypes { get; private set; }        

_>        #endregion
_>    }
_>


_>Второй вариант:


_>
_>public class ProgramsController
_>    {
_>        public ActionResult ResultWinners(int resultNum, int nextPage)
_>        {
_>            return RetryOnDeadlockReadOnly(context =>
_>                                           {
_>                                               var model = new ProgramWinnersViewModel();
_>                                               model.SelectedMainMenuItem = MainMenuItem.ProgramResults;

_>                                               bool nextPageExists;

_>                                               model.Winners = context.Repositories
_>                                                   .Get<EpiquePrizesWonRepository>()
_>                                                .GetWinnersData(nextPage, model.MaximumRows, out nextPageExists);

_>                                               model.NextPage = nextPageExists ? nextPage + 1 : (int?)null;

_>                                               return View("Result" + resultNum + "Winners", model);
_>                                           });
_>        }
_>    }
_>


_>Где ProgramWinnersViewModel:


_>
_>public class ProgramWinnersViewModel : MainMasterPageViewModel
_>    {
_>        public ProgramWinnersViewModel()
_>        {
_>            Winners = new SortedDictionary<string, IList<string>>();
_>            MaximumRows = 20;
_>        }

_>        public SortedDictionary<string,IList<string>> Winners { get; set; }
_>        public int MaximumRows { get; private set; }
_>        public int? NextPage { get; set; }
_>    }
_>



_>Вопрос — какой вариант реализации предпочтелен и почему? Мне кажется, что в первом варианте, когда ViewModel сама себя из базы тянет — это порочный путь, хотя сейчас это работает и никаких вроде проблем нет. Какие последствия могут быть от такого варианта реализации?


Это по сути разные паттерны.
Первый — это MVVM, он пригоден для WPF. Второй — MVC, где "ViewModel" (я его обычно называю view data) служит только для передачи данные от controller во View, хорошо подходит для веба.
Заметная разница в этих паттернах появляется когда начинаешь заниматься вводом и нетривиально обработкой данных.
Самоинициализирующийся ViewModel
От: michael_isu Беларусь  
Дата: 03.12.10 07:00
Оценка:
Всем привет.

Вопрос несколько специфичный для asp.net mvc, но решил задать его тут, т.к. концептуальности в нем кажется больше.

Вот первый вариант реализации экшена:

public class CompanyController : BaseController
{    
    public ActionResult ProductList(ProductListRequest request)
        {
            request.Company = Company;
            return View("products/list", new ProductListModel(request));
        }
}


Где ProductListModel:

public class ProductListModel
    {
        public ProductListModel(ProductListRequest request)
        {
            Contract.Requires(request != null);

            Request = request;

            Products = Repositories.Products.Select(request.Company, request.ProductTypes);

            ProductTypes = Repositories.ProductTypes.Select(request.Company.Evaluate(v => v.Speciality));
        } 

        #endregion

        #region Instance Properties

        public ProductListRequest Request { get; private set; }
        public IEnumerable<Product> Products { get; private set; }
        public IEnumerable<ProductType> ProductTypes { get; private set; }        

        #endregion
    }


Второй вариант:

public class ProgramsController
    {
        public ActionResult ResultWinners(int resultNum, int nextPage)
        {
            return RetryOnDeadlockReadOnly(context =>
                                           {
                                               var model = new ProgramWinnersViewModel();
                                               model.SelectedMainMenuItem = MainMenuItem.ProgramResults;

                                               bool nextPageExists;

                                               model.Winners = context.Repositories
                                                   .Get<EpiquePrizesWonRepository>()
                                                .GetWinnersData(nextPage, model.MaximumRows, out nextPageExists);

                                               model.NextPage = nextPageExists ? nextPage + 1 : (int?)null;

                                               return View("Result" + resultNum + "Winners", model);
                                           });
        }
    }


Где ProgramWinnersViewModel:

public class ProgramWinnersViewModel : MainMasterPageViewModel
    {
        public ProgramWinnersViewModel()
        {
            Winners = new SortedDictionary<string, IList<string>>();
            MaximumRows = 20;
        }

        public SortedDictionary<string,IList<string>> Winners { get; set; }
        public int MaximumRows { get; private set; }
        public int? NextPage { get; set; }
    }



Вопрос — какой вариант реализации предпочтелен и почему? Мне кажется, что в первом варианте, когда ViewModel сама себя из базы тянет — это порочный путь, хотя сейчас это работает и никаких вроде проблем нет. Какие последствия могут быть от такого варианта реализации?
Re[2]: Самоинициализирующийся ViewModel
От: michael_isu Беларусь  
Дата: 03.12.10 09:04
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Это по сути разные паттерны.

G>Первый — это MVVM, он пригоден для WPF. Второй — MVC, где "ViewModel" (я его обычно называю view data) служит только для передачи данные от controller во View, хорошо подходит для веба.
G>Заметная разница в этих паттернах появляется когда начинаешь заниматься вводом и нетривиально обработкой данных.

Можно поподробнее о разнице? Почему MVVM пригоден в WPF и непригоден в MVC? Наша команда занимается только вебом на asp.net mvc, при этом отдельные члены пишут в стиле MVVM, нужно как-то убедить в порочности этого пути
Re[3]: Самоинициализирующийся ViewModel
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 03.12.10 09:24
Оценка:
Здравствуйте, michael_isu, Вы писали:

_>Здравствуйте, gandjustas, Вы писали:


G>>Это по сути разные паттерны.

G>>Первый — это MVVM, он пригоден для WPF. Второй — MVC, где "ViewModel" (я его обычно называю view data) служит только для передачи данные от controller во View, хорошо подходит для веба.
G>>Заметная разница в этих паттернах появляется когда начинаешь заниматься вводом и нетривиально обработкой данных.

_>Можно поподробнее о разнице? Почему MVVM пригоден в WPF и непригоден в MVC? Наша команда занимается только вебом на asp.net mvc, при этом отдельные члены пишут в стиле MVVM, нужно как-то убедить в порочности этого пути


Я же говорю, напишите пример, который не просто достает данные из базы, а получает их от пользователя и нетривиальным образом обрабатывает.
Вам понадобится или размазывать логику по viewmodel и контроллеру или тупо передавать все параметры контроллера во view model
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.