【问题标题】:Strategy Pattern with Simple Injector带有简单注入器的策略模式
【发布时间】:2017-07-11 17:50:47
【问题描述】:

我有一个工作流,我需要根据一些运行时数据使用特定的服务类。

例如。我有一个SendEmailCommand,它的依赖项为IEmailService,有两个实现MandrillEmailService 和SmtpEmailService。

SendEmailCommand 将确定它在运行时使用 IEmailService 的哪个实现。

每个电子邮件服务实现都有自己的依赖关系,由 Simple Injector 连接起来。

我不确定SendEmailCommand 将如何确定要使用的实现 (IEmailService) 或如何将这些服务与运行时数据联系起来。

一些代码:

SendEmailCommand.cs 处理程序

public void Handle(SendEmail command) {
  IEmailService service;

  if(/* some condition */) {
    service = // What to do here?
  } else {
    service = // What to do here?
  }
}

服务可以用我猜的策略代替。

【问题讨论】:

    标签: c# dependency-injection simple-injector


    【解决方案1】:

    (对我而言)最明显的解决方案是定义一个新的抽象,允许在向邮件服务实现提供运行时数据的同时分派给它。这可能看起来像这样:

    interface IMailServiceDispatcher
    {
        void Send([runtime data], [mail service arguments]);
    }
    

    这允许你的命令处理程序变成:

    private readonly IEmailServiceDispatcher dispatcher;
    public void Handle(SendEmail command) {
      var data = /* runtime data */
      this.dispatcher.Send(data, /* mail service parameters */);
    }
    

    现在您可以为IMailServiceDispatcher 创建一个实现,如下所示:

    class EmailServiceDispatcher : IEmailServiceDispatcher
    {
        IMailService man; IMailService smtp;
        public EmailServiceDispatcher(IMailService man, IMailService smtp) { ... }
    
        public void Send(runtimeData, parameters) =>
            GetService(runtimedData).Send(parameters);
    
        private IMailService GetService(runtimeData) =>
            /* some condition using runtime data */ ? man : smtp;
    }
    

    您可以按如下方式连接所有这些:

    container.Register<IMailServiceDispatcher, MailServiceDispatcher>();
    container.RegisterConditional<IMailService, MandrillEmailService>(WithParamName("man"));
    container.RegisterConditional<IMailService, SmtpEmailService>(WithParamName("smtp"));
    
    // Helper method
    private static Predicate<PredicateContext> WithParamName(string name) =>
        c => c.Consumer.Target.Name == name;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-07
      • 1970-01-01
      • 2016-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多