Как получить доступ к зарегистрированному экземпляру DI из POCO? - PullRequest
0 голосов
/ 12 февраля 2019

Это в проекте .NET Core.При запуске я регистрирую синглтон для моей службы перевода, который инициализируется с настройками конфигурации из appsettings.json.Как только это установлено, все приложение будет использовать этот сервис.Это прекрасно работает в моих контроллерах и репозиториях, я просто определяю конструктор, который принимает этот интерфейс, и он внедряет, как и ожидалось:

services.AddSingleton<Foo.Bar.ITranslationService>(
    new Foo.Bar.SomeTranslator(config.TranslationSettings));

Но проблема, с которой я столкнулся, заключается в том, что POCO необходимо использовать эту службу перевода,И все мои POCO генерируются репозиторием как обобщенные, поэтому, например, метод репозитория может выглядеть следующим образом:

public TEntity GetById(object id){
    return connection.Get<TEntity>(id);
}

Таким образом, в репозиторий передается внедренный TranslationService, но есть ли способ для чистогопередать это POCO, которому это нужно, используя DI?Или мне нужно как-то взломать?Я пытаюсь найти самый чистый способ сделать это, спасибо!

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Как насчет ввода свойства?

public TEntity GetById(object id){
    var entity = connection.Get<TEntity>(id);

    if (entity is ITranslatable t)
    {
        t.Translator = _translationService;
    }

    return entity;
}
0 голосов
/ 12 февраля 2019

Вам необходимо добавить интерфейс перевода в конструктор этого объекта.

public class MYPOCO
{
    private Foo.Bar.ITranslationService translator
    public MYPOCO(Foo.Bar.ITranslationService translator)
    {
        this.translator = translator;
    }
}

Это позволит вам использовать службу перевода в классе.Но вы столкнетесь с рядом проблем.

  • Если фреймворк явно не создаст ваш POCO, тогда он не будет введен.Например, это должен быть какой-то Контроллер, который будет создан платформой, как только будет вызван маршрут.
  • Вам могут понадобиться собственные фабрики для создания экземпляров POCO.
  • Чтобы сохранить POCO настолько чистым, насколько это возможно, вам, вероятно, нужна фабрика, которая создаст экземпляр вашего POCO и настроит переводы соответствующим образом.Фабрика воспользуется услугами переводчика.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...