Сервисный локатор Anti-Pattern хорошо для регистрации завода - PullRequest
0 голосов
/ 05 июля 2018

Я создаю инфраструктуру REST, и мне интересно, можно ли предоставить доступ поставщику услуг, поскольку он будет использоваться на фабрике. У меня есть общий сервис, который имеет события, которые запускаются при создании и обновлении

public event Func<object, TDTO, Task> CreateEvent;

protected virtual async Task OnCreated(TDTO dto)
{
    await ServiceEventHandlerRule.OnServiceEvent(CreateEvent, this, dto);
}

public async Task<TDTO> Create(TDTO dto)
{
    var entity = this.DtoToEntity(dto, new TEntity());
    this._context.Set<TEntity>().Add(entity);

    dto = await this.SaveEntity(entity);
    await OnCreated(dto);
    return dto;
}

Я регистрирую события на своих устройствах на фабрике, в настоящее время я выставляю Func<IServiceProvider, Object, TDto> Регистрация событий выглядит так, это происходит в моем автозагрузке. Ccs:

var serviceConfig = new ServiceConfiuration<User, UserDTO>();
serviceConfig.EventMapping.AddCreateEvent(async (sp, obj, dto) => {
    var hubTaskQueue = sp.GetService<IHubServiceTaskQueue>();
    hubTaskQueue.QueueCreate<THub, TDTO>(dto);
});
services.AddScopedRestService(serviceConfig);

Пользователям потребуется доступ к нескольким дополнительным зависимостям для их событий, поэтому я предоставил им доступ к IServiceProvider,

В чем недостаток использования шаблона расположения службы при регистрации?

Должен ли я замаскировать IServiceProvider и сделать несколько общих перегрузок, которые автоматически разрешат их зависимости?

1 Ответ

0 голосов
/ 05 июля 2018

В Внедрение зависимостей в .NET, второе издание , мы определяем Service Locator как:

A Service Locator предоставляет компоненты приложения за пределами Composition Root с доступом к неограниченному набору Volatile Dependencies . [Глава 5.2]

Корень компоновки - это единое логическое расположение в приложении, где модули компоноваются. Вы можете найти подробное описание того, что такое корень композиции в этом отрывке из книги.

Что касается вашего вопроса, важная часть определения сервисного локатора: «вне корня композиции». Другими словами, при доступе к неограниченному набору изменчивых зависимостей из в пределах корень композиции работает нормально и не является реализацией антишаблона локатора службы. Доступ к ним вне корня композиции, однако, является анти-паттерном.

Таким образом, чтобы ответить на ваш вопрос, вы можете спокойно позволить вашей фабрике зависеть от контейнера или абстракции, которая разрешает неограниченный набор зависимостей, если ваша фабричная реализация является частью корня композиции.

Этого можно добиться, поместив абстракцию фабрики рядом с логикой приложения, в то время как вы создаете реализацию фабрики в сборке запуска вашего приложения.

Пользователям потребуется доступ к нескольким дополнительным зависимостям для их событий, поэтому я предоставил им доступ к IServiceProvider. Каковы недостатки использования шаблона расположения службы при регистрации?

Если код, который зависит от IServiceProvider, является , а не частью корня композиции, они используют анти-шаблон Service Locator, и это следует предотвратить. Основные проблемы с анти-шаблоном Service Locator:

  • Модуль перемещается по локатору службы как избыточная зависимость.
  • Модуль делает неочевидным, каковы его зависимости. Это затрудняет тестирование такого модуля, скрывает тот факт, что класс может быть слишком сложным, и затрудняет проверку правильности графа зависимостей, поскольку зависимости выбираются лениво.

Вместо этого вы должны позволить этим пользователям определять их зависимости как аргументы конструктора.

...