В каком слое должна идти модель предметной области?
Мы должны написать приложение для цифровых вывесок для университетского проекта. Изначально мы используем следующие языки и платформы:.Net, C#, структура сущностей (с планами использования NHibernate), Winforms (с планами использования WPF).
Нам было сказано сделать это таким образом, чтобы мы могли легко изменить логику представления и постоянства.
По этой причине мы решили работать с тремя уровнями: уровень пользовательского интерфейса, который "знает" уровень обслуживания (или уровень бизнес-логики), уровень обслуживания, который знает уровень постоянства и уровень постоянства. Каждый из них - это отдельный проект. На данный момент доменные классы или классы сущностей (в данном случае такие классы, как Campaign, RSSFeed, User и т. Д.) Содержатся в пространстве имен "Model" в проекте или слое постоянства.
Мы определили некоторые интерфейсы для логики доступа к данным, чтобы можно было легко переключать носители данных.
Возникают следующие вопросы: если для изменения логики постоянства нам необходимо изменить фактические ссылки на проекты для ссылок на замену (например, Entity Framework для NHibernate), где должны быть определены эти интерфейсы? Что еще более важно, где должны быть определены классы домена? Является ли "действительным" добавить еще один уровень с именем, например, "Домен", известный по уровню постоянства и уровню обслуживания?
Я прошу прощения, если что-то, что я написал, кажется странным, мой письменный английский язык несколько ржавый.
1 ответ
Что вы можете сделать, это извлечь интерфейс для логики персистентности в отдельный проект. Затем просто внедрите реализацию (EF или NHibernate) в класс, который ее использует. Таким образом, класс, который использует его, нуждается только в ссылке на проект, содержащий интерфейс, а не на конкретную реализацию.
Что касается доменов, вы можете создать для каждого домена набор проектов, таких как Domains.NameHere.Facade, Domains.NameHere.Implementation, Domains.NameHere.UnitTests. Таким образом, вы также разделяете интерфейсы в проекте фасада. Вы можете добавить свой сервисный слой в проект Domains.Implementation, а также включить сюда все остальные классы вашего домена.
Для ваших моделей вы можете добавить отдельный проект, например, Domains.Models, или добавить их в свои фасадные проекты. Для вашей настойчивости вы можете иметь свой собственный проект модели. Таким образом, вы можете что-то изменить в своих моделях, не меняя свою постоянную часть.