Внедрение зависимостей: настройка и совместное использование свойств области обслуживания в ASP.NET Core - PullRequest
0 голосов
/ 25 октября 2018

Я хочу установить свойство в какой-либо внедренной службе в контроллере для последующего злоупотребления им, когда эта служба будет внедрена в другом месте во время того же запроса, поэтому я ожидаю, что это свойство не изменится, поскольку служба вводится как Scoped.

Это безопасный подход или как бы вы предложили добиться такого поведения?

MyController(IServiceWithProperty serviceWithProperty) {
  _serviceWithProperty = serviceWithProperty;
}

public IActionResult Get(int settingToSet) {
  _serviceWithProperty.SetProperty(settingToSet);
  return Ok(_anotherService.GetSomething()); 
}

И, как я сказал, AnotherService также вводит ServiceWithProperty.

public class AnotherService : IAnotherService {
  public AnotherService(IServiceWithProperty serviceWithProperty) {
    _serviceWithProperty = serviceWithProperty;
  }

  public string GetSomething() {
    int prop = _serviceWithProperty.GetProperty(); //here I expect to get property which has been set in controller, would that work and is it fine to do it like that?
  } 
}

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Взаимодействие между этими двумя службами будет трудно проследить, как только размер базы кода увеличится.Даже учитывая этот простой пример (хорошая работа по сокращению проблемы до ее сути, кстати), мне пришлось несколько минут посмотреть на код, чтобы понять, что происходит.

Кроме того, подобный дизайн кажетсябудьте близки к нарушению принципа замены Лискова (LSP), потому что он будет работать только тогда, когда используются конкретные конкретные реализации.Согласно LSP, вы должны иметь возможность обмениваться одним подтипом с другим без изменения правильности системы.Это возможно здесь?Можете ли вы заменить реализацию IServiceWithProperty, которую вы имеете в виду, другой реализацией, которая ничего не делает?

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

MyController(ITranslator translator) {
  _translator = translator;
}

public IActionResult Get(int setting) {
  return Ok(_translator.Translate(setting)); 
}

Следующий шаг - выяснить, как реализоватьITranslator интерфейс.

0 голосов
/ 25 октября 2018

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

Однако я бы рекомендовал использовать эти значения не как свойства, а как аргументы ваших сервисных функций, таких как:

public IActionResult Get(int settingToSet) 
{
    return Ok(_anotherService.GetSomething(settingToSet)); 
}

public class AnotherService : IAnotherService 
{
    public AnotherService(ISomeAnotherService service) 
    {
         _service = service;
    }

    public string GetSomething(int inputValue) 
    {
        int serviceResult = _service.GetSomething(inputValue);
    } 
 }

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

...