【问题标题】:How Can I Inject All my Strategy Pattern Objects Into a List?如何将我所有的策略模式对象注入到列表中?
【发布时间】:2020-03-08 03:42:27
【问题描述】:

我已经实现了策略模式。我有一个基本接口,并且将选择我将在运行时使用该接口的哪个实现。问题是,我不知道有一种优雅的方式可以填充一个对象来存储我的所有实现,而无需像这样对它们进行硬编码(更新它们):

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);
        }
    }

【问题讨论】:

标签: c# dependency-injection strategy-pattern


【解决方案1】:

在启动时注册每个实现,用抽象映射它们,

ConfigureServices(IServiceCollection 服务)

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&lt;IMessageFormat&gt; 注入目标依赖实例。

public class FixMessageFormatter {
    private List<IMessageFormat> _messageFormats;

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

    // ... Other code.
}

DI 容器将注入所有已注册的实现。

参考Logging in .NET Core and ASP.NET Core

【讨论】:

  • services 指的是什么?它将如何将抽象 IMessageFormat、MassQuoteMessageFormat 与_messageFormats 关联起来?如果是静态类,可以注入FixMessageFormatter吗?您可以参考我更多的文档吗?
  • @TeeZadAwk 添加了文档链接。这对于 statis 类默认不起作用,您必须恢复为服务定位器反模式,通常不建议采用这种方法
  • 我仍然有这个问题。我该如何处理private void ConfigureServices(IServiceCollection services) 方法?我在哪里称呼它?这个可枚举注入的 FIxMessageFormatter 类是如何创建的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多