Я был бы очень признателен за мнения людей по указанной ниже проблеме дизайна.
У меня есть модель, в которой «Лицо» или «Бизнес» может быть поставщиком определенной «Услуги». Пример определения класса показан ниже:
IProvider
Guid Id
Человек: IProvider
Guid Id
string FirstName
string LastName
Компания: IProvider
Guid Id
string Name
Служба
Guid Id
IProvider поставщик
Поэтому я создал соответствующие концепции в своей области: «Человек», «Бизнес», «IProvider» и «Сервис». Я борюсь с тем, какие объекты создавать репозитории. В этом контексте «Сервис» является совокупным корнем и, следовательно, имеет собственное хранилище. «Бизнес» также является совокупным корнем в моем контексте, поскольку он будет иметь значение, даже если он не является поставщиком. «Лицо» будет создано в системе только в том случае, если оно «является Провайдером».
Могу ли я создать репозиторий для роли IProvider, который будет возвращать мне экземпляры «Person» и «Business»; мои проблемы с этим заключаются в том, что код может быстро стать довольно сложным, поскольку любая реализация должна будет смотреть на несколько таблиц и т.д., чтобы вернуть все разные типы IProvider. Такой подход потребует создания репозиториев для «Person» и «Business» и внедрения их в репозиторий «IProvider» для обеспечения необходимой функциональности, т. Е.
public class ProviderRepository : IProviderRepoistory
{
public IBusinessRepository businessRepository {get; set; }
public IPersonRepository personRepository {get; set; }
public IProvider FindById(Guid Id){
IProvider entity = businessRepository.FindById(Id);
if(entity == null)
entity = personRepository.FindById(Id);
return entity;
}
}
Другой оценкой будет создание репозиториев для сущностей «Лицо» и «Бизнес», которые реализуют интерфейс «IProvider», тем самым делая их доступными для участия в этой роли. т.е.
public class PersonRepository : IPersonRepository, IProviderRepository
{
private ISession session;
public Person FindById(Guid Id){
return session.Query<Person>().FirstOrDefault<Person>(x => x.Id == Id);
}
public IProvider FindById(Guid Id){
return session.Query<Person>().FirstOrDefault<Person>(x => x.Id == Id && x.IsProvider == true);
}
}
Затем я бы использовал механизм (то есть контейнер IoC), чтобы выбрать правильную конкретную реализацию IProviderRepository, когда это необходимо. Например, если я имею дело с поставщиком, который, как я знаю, является человеком, я могу получить реализацию PersonRepository.
Другой вариант - не реализовывать какие-либо репозитории IProvider, а просто придерживаться репозиториев «Person» и «Business» и использовать их по мере необходимости на уровне обслуживания?