Я думаю, что здесь есть несколько вещей, которые следует учитывать.
Прежде всего, если вы действительно заинтересованы в моделировании своего домена, вы захотите во что бы то ни стало попытаться сохранить доменные объекты свободнымисквозные проблемы, такие как проверка, контейнеры IoC и постоянство, несмотря на шаблон Active Record.
Это означает, что Customer
, вероятно, не должно иметь никаких ссылок на репозиторий, даже если вы используетеинтерфейсы и сервисный локатор.Он должен быть спроектирован так, чтобы отражать атрибуты - или то, что составляет - «клиента» с точки зрения вашего целевого клиента / пользователя.
За исключением моделирования домена, меня немного беспокоит использованиевашего IoC
сервисного локатора в инициализаторе переменной.Вы упускаете любую возможность ловить исключения и исключения, создаваемые конструкторами, как известно, их трудно отлаживать (эти инициализаторы запускаются перед любым кодом в вашем первом нестатическом конструкторе).
Использование статического шлюза / локатора службы вместоВнедрение зависимостей также делает класс практически непроверенным (с использованием методологий автоматического модульного тестирования, то есть - вы можете выполнять интеграцию и ручное тестирование, но неудачные тесты вряд ли укажут вам на сломанные биты - в отличие от модульного теста,где вы точно знаете, что именно вы тестируете и, следовательно, что не работает).
Вместо того, чтобы объект Customer
заполнял себя данными, вызывая _customerRepository.Load(this)
в конструкторе, приложение будет чаще использоватьхранилище для получения сущности, поэтому оно возвращается из хранилища, полностью заполненного, включая свойство CustomerType
.В этом случае кажется, что это может произойти в CustomerController
.
. Вы указываете, что хотели бы иметь отдельный DAL от слоя, в котором находится CustomerController
, и у вас фактически это есть -- здесь вступает в действие интерфейс репозитория. Вы внедряете некоторую реализацию этого интерфейса (или в этом случае получаете реализацию из реализации IoC), но фактическая реализация этого репозитория может существовать вотдельный слой (это может быть даже другая сборка).Это шаблон, известный как отдельный интерфейс.
Лично я бы реорганизовал CustomerController, чтобы он выглядел так:
public class CustomerController : ControllerBase
{
private ICustomerTypeRepository _customerTypeRepository;
private ICustomerRepository _customerRepository;
public CustomerController(ICustomerRepository customerRepository,
ICustomerTypeRepository customerTypeRepository)
{
_customerRepository = customerRepository;
_customerTypeRepository = customerTypeRepository;
}
public ActionResult Index()
{
Customer customer
= _customerRepository.GetCustomerWithId(customerId);
// from where does customerId come?
IEnumerable<CustomerType> customerTypeList
= _customerTypeRepository.GetTypes();
. . .
}
}
… и я бы взял все ссылки на репозитории изCustomer
и любой другой класс сущностей домена.