Как ввести правильную зависимость на основе имени параметра конструктора - PullRequest
6 голосов
/ 07 августа 2011

У меня есть этот интерфейс, который используется несколькими конкретными типами, такими как EmailFormatter, TextMessageFormatter и т. Д.

public interface IFormatter<T>
{
    T Format(CompletedItem completedItem);
}

У меня проблема в том, что с моим EmailNotificationService я хочу ввести EmailFormatter. Подпись конструктора для этой службы public EmailNotificationService(IFormatter<string> emailFormatter).

Я почти уверен, что видел, как это было сделано ранее, но как мне зарегистрировать это в Windsor, чтобы он вставлял EmailFormatter, если имя параметра конструктора emailFormatter?

Вот мой регистрационный код в Виндзоре.

container.Register(Component.For<IFormatter<string>>().ImplementedBy<EmailFormatter>());

Ответы [ 2 ]

9 голосов
/ 08 августа 2011

Не пытайтесь решить эту проблему в конфигурации DI. Вместо этого, решите это в дизайне приложения. Мне кажется, что вы определили несколько разных вещей с одним и тем же интерфейсом. Ваши требования делают это довольно очевидным, поскольку вы говорите:

Я хочу добавить EmailFormatter

Вы не хотите вводить форматер; Вы хотите добавить форматер электронной почты. Другими словами, вы нарушаете принцип замены Лискова . Исправьте эту проблему в приложении. Определите интерфейс IEmailFormatter и пусть EmailNotificationService зависит от этого:

public interface IEmailFormatter
{
    string Format(CompletedItem completedItem);
}

public class EmailNotificationService
{
    public EmailNotificationService(IEmailFormatter formatter)
    {
    }
}

Это имеет два важных преимущества:

  1. Это делает код более понятным, так как теперь понятно, какая именно зависимость EmailNotificationService действительно имеет.
  2. Это делает настройку DI намного проще и удобнее в обслуживании. Достаточно взглянуть на регистрацию зависимостей в ответе Зака, и вы поймете, о чем я говорю.
6 голосов
/ 07 августа 2011

Сервисный код:

public EmailNotificationService(IFormatter<string> emailFormatter){...}

Код регистрации зависимости:

container.Register(
    Component.For<IFormatter<string>().ImplementedBy<TextMessageFormatter>().Named("TextMessageFormatter"),
    Component.For<IFormatter<string>().ImplementedBy<EmailFormatter>().Named("EmailFormatter"),
    Component.For<INotificationService>().ImplementedBy<EmailNotificationService>().ServiceOverrrides(
        ServiceOverride.ForKey("emailFormatter").Eq("EmailFormatter"))
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...