我不确定这是否可能 但我还是要问个问题
我有一个假想,我有一些不同的任务, 在处理过程中发送电子邮件。
电子邮件通过自定义类发送
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
}
}
我有一些任务需要使用电子邮件提供商,
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"));
}
}
随着每个信通部的执行问题都得到解决,我能否作出决定,决定由哪一种方式执行IEmailConfig,转至电子邮件Provider类的制造者?
当我为使用“服务覆盖”功能的每项任务注册电子邮件Provider 实例时。 这意味着对于需要发送邮件的每项任务,我几乎要重复电子邮件提供者的设置, 并且它需要配置。 我最后会列出这个列表...
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")));
每个任务都将重复这些内容。
IEmail Provider 执行总是相同的, 它只是通过 IEmailConfig 来改变每个不同任务。 我忍不住想, 对我迄今获得的解决方案, 一定有一个更清晰的解决方案 。