Здравствуйте, 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, хорошо подходит для веба.
Заметная разница в этих паттернах появляется когда начинаешь заниматься вводом и нетривиально обработкой данных.
Всем привет.
Вопрос несколько специфичный для 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 сама себя из базы тянет — это порочный путь, хотя сейчас это работает и никаких вроде проблем нет. Какие последствия могут быть от такого варианта реализации?
Здравствуйте, gandjustas, Вы писали:
G>Это по сути разные паттерны.
G>Первый — это MVVM, он пригоден для WPF. Второй — MVC, где "ViewModel" (я его обычно называю view data) служит только для передачи данные от controller во View, хорошо подходит для веба.
G>Заметная разница в этих паттернах появляется когда начинаешь заниматься вводом и нетривиально обработкой данных.
Можно поподробнее о разнице? Почему MVVM пригоден в WPF и непригоден в MVC? Наша команда занимается только вебом на asp.net mvc, при этом отдельные члены пишут в стиле MVVM, нужно как-то убедить в порочности этого пути
Здравствуйте, michael_isu, Вы писали:
_>Здравствуйте, gandjustas, Вы писали:
G>>Это по сути разные паттерны.
G>>Первый — это MVVM, он пригоден для WPF. Второй — MVC, где "ViewModel" (я его обычно называю view data) служит только для передачи данные от controller во View, хорошо подходит для веба.
G>>Заметная разница в этих паттернах появляется когда начинаешь заниматься вводом и нетривиально обработкой данных.
_>Можно поподробнее о разнице? Почему MVVM пригоден в WPF и непригоден в MVC? Наша команда занимается только вебом на asp.net mvc, при этом отдельные члены пишут в стиле MVVM, нужно как-то убедить в порочности этого пути
Я же говорю, напишите пример, который не просто достает данные из базы, а получает их от пользователя и нетривиальным образом обрабатывает.
Вам понадобится или размазывать логику по viewmodel и контроллеру или тупо передавать все параметры контроллера во view model