Я только что начал новый проект и, естественно, решил использовать много новых технологий.
Я использую (Свободно) NHibernate, ASP.NET MVC 3 и пытаюсь применить репозиторий.pattern.
Я решил разделить свою бизнес-логику в отдельный проект и определить службы, которые обертывают мои репозитории, чтобы я мог возвращать POCO вместо прокси NHibernate и поддерживать большее разделение между моей интерфейсной частью и логикой DA,Это также даст мне возможность легко предоставлять ту же логику, что и API позже (требование).
Я решил использовать общий интерфейс IRepository<T>
, где T
- это одна из моих сопоставленных сущностей NHibernateкоторые все реализуют IEntity (мой интерфейс на самом деле только маркер).
Проблема в том, что это идет вразрез с совокупным корневым шаблоном, и я начинаю ощущать боль модели анемичной области.
Если я изменяю объект, который висит на другом
- Root <- изменен <ul>
- Child <- изменен </li>
В моемСлужба Я должен сделать следующее:
public void AddNewChild(ChildDto child, rootId)
{
var childEntity = Mapper.Map<ChildDto,ChildEntity>(child);
var rootEntity = _rootrepository.FindById(rootId);
rootEntity.Children.Add(childEntity);
_childRepository.SaveOrUpdate(child);
_rootRepository.SaveOrUpdate(root);
}
Если я сначала не спасу ребенка, я получу исключение из NHibernate.Я чувствую, что мой универсальный репозиторий (мне в настоящее время требуется 5 из них в одном сервисе) - неправильный путь.
public Service(IRepository<ThingEntity> thingRepo, IRepository<RootEntity> rootRepo, IRepository<ChildEntity> childRepo, IRepository<CategoryEntity> catRepo, IRepository<ProductEntity> productRepo)
Мне хочется вместо того, чтобы сделать мой код более гибким, он делает его более хрупким,Если я добавляю новую таблицу, мне нужно пойти и изменить конструктор во всех моих тестах (я использую DI для реализации, так что это не так уж плохо), но это кажется немного вонючим.
У кого-нибудь естьсовет, как реструктурировать такую архитектуру?
Должен ли я сделать свои репозитории более конкретными?Является ли уровень абстракции сервиса слишком далеко?
РЕДАКТИРОВАТЬ : Есть несколько замечательных связанных вопросов, которые помогают: