如何在Castle Windsor中自动注册(按照惯例)通用装饰器

时间:2015-05-07 19:03:07

标签: c# dependency-injection inversion-of-control castle-windsor

我是Castle Windsor的新手,我想知道是否有人可以帮助我以通用方式注册以下组件,以便我的所有命令都能自动注册。还有如何添加装饰器。

编辑:以下似乎有效但我仍然坚持如何配置装饰器。

        WindsorContainer container = new WindsorContainer();

        container
            .Register(
                Classes.FromAssemblyInThisApplication()
                    .BasedOn(typeof(ICommand))
                    .LifestyleTransient());

public interface ICommand
{
}

public interface ICommandArgs
{
}

public interface ICommand<TArgs> : ICommand where TArgs : ICommandArgs
{
    void Execute(TArgs args);
}

public class ChangePasswordArgs : ICommandArgs
{
    public ChangePasswordArgs()
    {
    }
}

public class ChangePasswordCommand : ICommand<ChangePasswordArgs>
{
    public void Execute(ChangePasswordArgs args)
    {
        Console.WriteLine("[CHANGING PASSWORD]");
    }
}
 public class TransactionCommand<TArgs> where TArgs : ICommandArgs
{
    private readonly ICommand<TArgs> innerCommand;

    public TransactionCommand(ICommand<TArgs> innerCommand)
    {
        this.innerCommand = innerCommand;
    }

    public void Execute(TArgs args)
    {
        this.innerCommand.Execute(args);
    }
}

编辑:这是我目前所在的地方,但装饰者没有得到正确解决:

       container.Register(
            Component.For(typeof(ICommand<>))
                .ImplementedBy(typeof(TransactionalCommand<>))
                    .LifestyleTransient(),
            Classes.FromAssemblyInThisApplication()
                .BasedOn(typeof(ICommand<>))
                    .WithService.AllInterfaces()
                        .LifestyleTransient()
        );

1 个答案:

答案 0 :(得分:2)

Herehere是有关城堡,自动注册(按惯例)和装饰器的所有主题的列表。 Thisthis就是很好的例子。如果您尝试首先搜索问题并阅读,因为它已经很久以前就已经回答了,那么对您来说会更有成效。 马克·西曼(Mark Seeman)撰写了一本关于城堡的IoC in .NET的好书,this one。这本书展示了许多城堡的例子。你也可以查看他的博客。