English 中文(简体)
使用 IWindsorInstaller 的动态构造输入
原标题:Dynamic Constructor Injection using IWindsorInstaller

我不确定这是否可能 但我还是要问个问题

我有一个假想,我有一些不同的任务, 在处理过程中发送电子邮件。

电子邮件通过自定义类发送

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 来改变每个不同任务。 我忍不住想, 对我迄今获得的解决方案, 一定有一个更清晰的解决方案 。

最佳回答

http://docs.castleproject.org/Windsor.Handler-Selectors.ashx" rel =“no follow”> handler 选择者 将满足你的要求。IEmailProvider和ICommand各有一份。

IEmail Provider 可以检查被激活的 IEmail Provider (如“ Task1Email Provider ”) 的名称, 并脱下“ provider ”, 并在“ Config ” 上添加“ Config ”, 这将使您获得“ Task1EmailConfig ” 的密钥, 该密钥可用于解决特定的 IEmailConfig 对象 。

同样,对伊斯兰信使也做同样的事情。 它会依赖你 命名你的IEmailConfigs 一贯, 但它会消除你所有的手电线 现在做。

问题回答

暂无回答




相关问题
castle IOC - resolving circular references

quick question for my MVP implementation: currently I have the code below, in which both the presenter and view are resolved via the container. Then the presenter calls View.Init to pass himself to ...

Castle Windsor auto registration

I currently have the following registration set up private static void AddFrameworkComponentsTo(IWindsorContainer container) { container.AddComponent<ITypeConverter, TypeConversionFacade>();...

Authorization and Windsor

I m trying to implement my custom authorize attribute like: public class MyCustomAuth : AuthorizeAttribute { private readonly IUserService _userService; public MyCustomAuth(IUserService ...

How can I override a component registered in Castle Windsor?

I m just starting with Windsor, so please be gentle :) I have a scenario where I want to be able to override/replace components placed inside a windsor container. Read on ... In my prod code, I want ...

热门标签