Лучшие практики для создания полнофункционального интернет-DomainContext
Если вы обратитесь к любым MVVM-образцам Silverlight, вы обнаружите, что каждая ViewModel имеет свой собственный DomainContext. Однако я действительно не вижу необходимости в том, чтобы у ViewModel был определенный DomainContext.
Я склонен создавать общий DomainContext для всех ViewModels. Таким образом, когда проблема добавления сущности в другой DomainContext и удаления ее из другого DomainContext никогда не возникает. В противном случае может случиться так, что вы пытаетесь удалить из DomainContext, который не имеет та конкретная сущность вообще и так исключение..
Может ли кто-нибудь сказать мне, что лучшие практики говорят о DomainContext?
2 ответа:
Мои два учебника по MVVM, которые есть...
построение корпоративных приложений с помощью Windows ® Presentation Foundation и шаблона Model View ViewModel от Raffaele Garofalo
Pro WPF и Silverlight MVVM эффективная разработка приложений с Model-View-ViewModel от Gary McLean Hall
...Не обращайтесь непосредственно к DomainContext. Тем не менее, оба автора согласны, что там, где речь идет о уровне доступа к данным, шаблон проектирования "единицы работы" является рекомендуемый. Если вы планируете использовать один или несколько DomainContext(ов) в приложении SL как часть вашего уровня доступа к данным, вам будет рекомендовано (по крайней мере, этими властями) рассмотреть возможность инкапсуляции их в шаблон "единица работы". Пусть ваш ViewModel разбирается с этими абстракциями.
Что касается лучших практик, я думаю, что вы удовлетворили "лучшие практики", когда эти паттерны были тщательно рассмотрены. Реализация их может оказаться излишней для многих. ситуации.Есть введение в "единицу работы" в http://msdn.microsoft.com/en-us/magazine/dd882510.aspx
Есть много способов сделать это, так что лучшее, что я могу сделать, это поделиться тем, что я делаю.
1) Создайте каждый контекст домена на основе функции. Например, у меня будет контекст для всех пользовательских функций, один для всех функций клиента,один для функций заказа и т. д. Это позволяет проводить чистую сегментацию бизнес-слоев.
2) Создайте в веб-проекте пользовательские классы, которые будут возвращены вместо абстрактных представлений, созданных мастером. У меня лично есть проблема с тем, чтобы иметь имя мое представление БД, указанное в IQueryAble, вернулось в проект Silverlight, поскольку проект Silverlight можно считать слоем пользовательского интерфейса. Это вынуждает опосредованно зависеть от уровня данных, чего мы не хотим. Да, это создает больше работы с добавлением дополнительных классов, но это помогает применять абстракцию для правильной 3-слойной архитектуры.
3) Создайте пользовательские классы на уровне пользовательского интерфейса, которые будут обрабатывать возвращенные данные из сопоставленных методов (из DataContext). Это помогает обеспечить соблюдение абстракция. Помните, что конечная цель состоит в том, чтобы сделать ваш код как можно более слабо связанным. Это всегда требует дополнительного (а иногда и избыточного) кодирования с вашей стороны, но конечный результат стоит усилий.Вы также можете рассмотреть возможность создания библиотеки классов RIA, которая позволит вам абстрагироваться дальше. Это не самая простая реализация, но это шаг в правильном направлении при попытке облегчить коммуникацию между Silverlight и веб-проектами.