これが可能かどうかはわかりませんが、とにかく質問したいと思います。
処理中に電子メールを送信するさまざまなタスクがあるシナリオがあります。
メールの送信は、カスタム クラスを介して行われます
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 だけです。私がこれまでに得たものには、もっときちんとした解決策があるに違いないと考えずにはいられません。