Как я могу вставить все мои объекты шаблонов стратегии в список? - PullRequest
0 голосов
/ 08 марта 2020

Я реализовал шаблон стратегии. У меня есть базовый интерфейс, и я буду выбирать, какую реализацию этого интерфейса я буду использовать во время выполнения. Проблема в том, что я не знаю элегантного способа, которым я мог бы заполнить объект для хранения всех моих реализаций без их жесткого кодирования (создания новых) следующим образом:

public class FixMessageFormatter
{
    List<IMessageFormat> _messageFormats = new List<IMessageFormat>{ new MassQuoteMessageFormat(), }
    // ... Other code.
}

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

Для контекста ниже приведен мой интерфейс и одна реализация.

Интерфейс

    public interface IMessageFormat
    {
        List<FixMessageType> MessageType { get; }
        bool IsProperType(FixMessageType fixMessageType);
        StringBuilder FormatMessage(FixMessage fixMessage);
    }

Реализация

    public class MassQuoteMessageFormat : IMessageFormat
    {
        public List<FixMessageType> MessageType => new List<FixMessageType>{ FixMessageType.MassQuote };

        public StringBuilder FormatMessage(FixMessage fixMessage)
        {
            var stringBuilder = new StringBuilder();
            // ... Code
            return stringBuilder;
        }

        public bool IsProperType(FixMessageType fixMessageType)
        {
            return MessageType.Contains(fixMessageType);
        }
    }

1 Ответ

0 голосов
/ 08 марта 2020

Зарегистрируйте каждую реализацию во время запуска, сопоставив их с абстракцией,

ConfigureServices (IServiceCollection services)

services.AddScoped<IMessageFormat, MassQuoteMessageFormat>(); //<-- or other lifetime scope
//add other implementation...
//they could be done via reflection to auto register.

services.AddScoped<FixMessageFormatter>(); //also adding target

и вставьте IEnumerable<IMessageFormat> в цель зависимый экземпляр.

public class FixMessageFormatter {
    private List<IMessageFormat> _messageFormats;

    public FixMessageFormatter (IEnumerable<IMessageFormat> formats) {
        _messageFormats = formats.ToList();
    }

    // ... Other code.
}

Контейнер DI внедрит все зарегистрированные реализации.

Ссылка Вход в систему. NET Core и ASP. NET Core

...