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

いくつかのハンドラーセレクターが必要なものに役立つと思います。1 つは IEmailProvider 用で、もう 1 つは ICommand 用です。

IEmailProvider は、アクティブ化されている IEmailProvider の名前 (「Task1EmailProvider」など) を確認し、「Provider」を削除して「Config」を追加することができます。これにより、特定の問題を解決するために使用できるキー「Task1EmailConfig」が得られます。 IEmailConfig オブジェクト。

同様に、ICommand についても同じことを行います。IEmailConfig に一貫した名前を付けることに依存しますが、現在行っている手作業をすべて排除します。

于 2012-05-24T01:03:08.953 に答える