1

我不确定这是否可能,但我还是会问这个问题。

我有一个场景,我有许多不同的任务在处理过程中发送电子邮件。

电子邮件的发送是通过自定义类完成的

public interface IEmailProvider
{
    void SendEmail(some params);
}
public class EmailProvider : IEmailProvider
{
    private readonly IEmailConfig _config;

    public EmailProvider(IEmailConfig config)
    {
        _emailConfig = emailConfig;
    }

    public void SendEmail(some params)
    {
        // send the email using the params
    }
}

我有一些使用电子邮件提供程序的任务,每个任务都提供自己的 IEmailConfig 实现。

public class Task1 : ICommand
{
    public Task1(IEmailProvider emailProvider)
    {}
}

public class Task2 : ICommand
{
    public Task2(IEmailProvider emailProvider)
    {}
}

这是我设置的基本示例

public class TestInstaller : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        // Default email provider set up
        container.Register(Component.For<IEmailProvider>().ImplementedBy<EmailProvider>()
            .Named("DefaultEmailProvider")
            .LifeStyle.Transient);

        // Task 1 email config set up
        container.Register(Component.For<IEmailConfig>().ImplementedBy<Task1EmailConfig>()
            .Named("Task1EmailConfig"));

        // Task 2 email config set up
        container.Register(Component.For<IEmailConfig>().ImplementedBy<Task2EmailConfig>()
            .Named("Task2EmailConfig"));

        // Task 1 set up
        container.Register(Component.For<ICommand>().ImplementedBy<Task1>()
            .Named("Task1Command"));


        // Task 2 set up
        container.Register(Component.For<ICommand>().ImplementedBy<Task2>()
            .Named("Task2Command"));
    }
}

有没有一种方法可以让我做出决定,因为每个 ICommand 实现正在被解析,关于 IEmailConfig 的哪个实现传递给 EmailProvider 类的构造函数?

目前,我使用 ServiceOverride 功能为每个任务注册了一个 EmailProvider 实例。这意味着对于需要发送电子邮件的每个任务,我几乎必须复制电子邮件提供商的设置,并且它是必需的配置。我最终列出了这个......

Component.For<IEmailConfig>()
    .ImplementedBy<Task1EmailConfig>()
    .Named("Task1EmailConfig"));

Component.For<IEmaiProvider>()        
    .ImplementedBy<EmailProvider>)
    .Named("Task1EmailProvider")
    .DependsOn(ServiceOverride.ForKey("config").Eq("Task1Config"));

Component.For<ICommand>()
    .ImplementedBy<Task1>()
    .DependsOn(ServiceOverride.ForKey("emailProvider").Eq("Task1EmailProvider")));

对于每个任务,这将全部重复。

IEmailProvider 实现始终相同,只是传入的 IEmailConfig 会针对每个不同的任务进行更改。我不禁想到必须有一个更整洁的解决方案来解决我目前所拥有的解决方案。

4

1 回答 1

1

我认为几个处理程序选择器可以满足您的需求。一个用于 IEmailProvider,一个用于 ICommand。

IEmailProvider 可以检查被激活的 IEmailProvider 的名称(如“Task1EmailProvider”)并去掉“Provider”并添加“Config”——这将为您提供可用于解决特定问题的密钥“Task1EmailConfig” IEmailConfig 对象。

同样,对 ICommand 执行相同的操作。它将依赖于您始终如一地命名您的 IEmailConfig,但它会消除您现在正在做的所有手动接线。

于 2012-05-24T01:03:08.953 回答