Опять же - я запутался в вещах DDD:)
У меня есть архитектура (я все еще над ней работаю), которая вкратце выглядит так:
DataLayer:
EntityDao -> Implementing domain layer interfaces (NHibernate)
DomainLayer:
EntityRepository -> Repository for each entity with injected Dao
DomainObjects/Entitys -> Some logic
UI
ASP.Net MVC
И я сейчас нахожусь в той точке, где я чувствую, что создаю и использую какой-то класс Service. У меня есть несколько вопросов с этим:
1.Можно ли создать хотя бы одну службу для каждого объекта сущности / домена?
2.a. Должны ли службы иметь метод запроса, такой как Find, FIndAll, FindAll (LINQQuery)?
2.b. Должен ли я прекратить использовать Repositorys в верхних слоях (UI) для получения наборов ("Find" -подобных методов) сущностей и начать использовать только сервисы?
3.Если ответ на 2 вопроса - Нет, должен ли я использовать службы и репозиторий параллельно (когда в пользовательском интерфейсе мне просто нужно получить все объекты, я использую Repository.FindAll, когда мне нужно получить некоторый «логический» список я использую метод Service.FindXXX)?
4. Как-то мне кажется, что репозитории не вписываются в слой домена - нужно ли их как-то разделять, а в DOMAIN оставлять только объекты, относящиеся к домену, такие как Entity и Services? Если да - приведите пример структуры, как этого добиться.
Примеры некоторых объектов:
ДАО:
public class NHibernateDao<T> : IDao<T>
{
public NHibernateDao() { }
public T Get(object id)
{
T entity = (T)NHibernateSession.Get(entityType, id);
return entity;
}
public T Load(object id)
{
T entity = (T)NHibernateSession.Load(entityType, id);
return entity;
}
public virtual T Update(T entity)
{
NHibernateSession.Update(entity);
return entity;
}
...
Repository:
public class BaseRepository<T>:IRepository<T>
{
private DataInterfaces.IDao<T> mDao;
public virtual T Get(object id)
{
return mDao.Get(id);
}
public virtual void Delete(T entity)
{
mDao.Delete(entity);
}
public virtual T Update(T entity)
{
return mDao.Update(entity);
}
public virtual IQueryable<T> FindAll()
{
return mDao.FindAll();
}
...
Доменные объекты, на данный момент это в основном контейнер get / set - основанием для этого вопроса является удаление этой анемичной модели.