Простой инжектор: внедрение свойства в базовый класс - PullRequest
4 голосов
/ 03 июня 2011

В течение нескольких недель я с большим успехом использовал контейнер для инъекций зависимостей Simple Injector .Я люблю легко, с помощью которого я могу настроить его.Но теперь у меня есть дизайн, который я не знаю, как настроить.У меня есть базовый класс, в который наследуется много типов, и я хочу добавить зависимость в свойство базового класса, но без необходимости настраивать ее для каждого производного класса.Я пытался сделать это с атрибутами, но Simple Injector не поддерживает атрибуты.Вот урезанная версия моего дизайна.

public interface Handler<TMessage> where TMessage : Message
{
    void Handle(TMessage message);
}

public abstract class BaseHandler
{
    // This property I want to inject
    public HandlerContext Context { get; set; }
}

// Derived type
public class NotifyCustomerHandler : BaseHandler,
    Handler<NotifyCustomerMessage>
{
    public NotifyCustomerHandler(SomeDependency dependency)
    {
    }

    public void Handle(NotifyCustomerMessage message)
    {
    }
}

Моя конфигурация теперь выглядит следующим образом:

container.Register<HandlerContext, AspHandlerContext>();
container.Register<Handler<NotifyCustomerMessage>, NotifyCustomerHandler>();
// many other Handler<T> lines here

Как добавить свойство в BaseHandler?

Заранее спасибо за любую помощь.

1 Ответ

9 голосов
/ 03 июня 2011

Документация Simple Injector по внедрению свойства дает очень четкое объяснение по этому поводу.Основные параметры:

  • Зарегистрируйте делегат инициализации, используя RegisterInitializer.
  • Переопределить простой инжектор PropertySelectionBehavior.

Как объясняется в документации,использование RegisterInitializer не рекомендуется для внедрения свойств в зависимости;только для значений конфигурации.

Это оставляет вам переопределение Simple Injector's PropertySelectionBehavior, но наличие базового класса само по себе пахнет как твердое нарушение.Пожалуйста, взгляните на следующую статью .Он описывает, почему иметь базовый класс может быть плохой идеей, и в статье представлено решение для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...