Советы по изоляции моего слоя nhibernate так, чтобы я мог поменять его с EF потенциально - PullRequest
2 голосов
/ 18 сентября 2011

Хорошо, похоже, в настройках моего проекта могут быть какие-то улучшения.

В настоящее время у меня есть:

1. ASP.NET MVC3 Web project
2. NHibernate project with Repositories/Mappings and some session code.
3. Entities (models used in nhibernate like User.cs)
4. Interfaces (like IUser, IRepository<IUser>, IUserRepository...)
5. Common (UserService, ..)

Теперь проблема в том, что мне в моих моделях nhibernate теперь нужно реализовать IUser, что мне не нравится, но я был вынужден сделать это, так как мой IRepository является общим, и я мог бы использовать IRepository<User>, поскольку пользователь в другом проекте, поэтому мне пришлось создать интерфейс и сделать IRepository<IUser>

Мне никогда не понадобится другая реализация User, так что это меня беспокоит.

Как я могу это исправить, держа вещи отдельно, чтобы я мог поменять свой ORM?

Ответы [ 2 ]

1 голос
/ 18 сентября 2011

Я думаю, вам следует подойти к этой проблеме с точки зрения Domain Driven Design . Домен должен быть постоянным-невежественным. Правильная реализация DDD репозитория является ключевым моментом здесь. Интерфейс репозитория является специфическим, ориентированным на бизнес, а не универсальным. Реализация репозитория инкапсулирует все технические аспекты доступа к данным (ORM). Пожалуйста, посмотрите этот ответ и эти 2 статьи:

Ваши сущности должны быть конкретными типами, а не интерфейсами. Хотя вам, возможно, никогда не придется менять свой ORM (как говорит Ладислав в комментариях), вы должны создать его , как если бы вам нужно было поменять его . Такое мышление действительно поможет вам достичь постоянного невежества.

1 голос
/ 18 сентября 2011

Интерфейс IUser должен быть определен на уровне сущностей, если ваши сущности реализуют его, а не на уровне Interfaces. Также я бы, вероятно, переименовал этот общий слой Interfaces в Repositories или AbstractRepositories или что-то еще. Также я бы переименовал слой Common в Services, если он содержит сервисы, объединяющие ваши репозитории.

Таким образом, изображение может быть:

  1. ASP.NET MVC3 Веб-проект
  2. Проект NHibernate с репозиториями / сопоставлениями и некоторым сессионным кодом.
  3. Доменные объекты (модели, используемые в nhibernate, такие как User.cs и реализующие доменные интерфейсы, такие как IUser)
  4. Хранилища (например, IRepository<IUser>, IUserRepository ...)
  5. Сервисы (UserService, ..)
...