温莎城堡:如何按惯例注册委托方法?

时间:2013-06-25 23:48:58

标签: c# dependency-injection castle-windsor

我正在编写命令行应用程序并使用Castle Windsor作为DI。温莎城堡对我来说是新的,决定学习另一个DI容器。否则我通常使用Autofac。

我正在尝试按惯例注册命令行选项对象,但在注册之前,我需要解析它们。

以下是简单注册的工作原理:

container.Register(Component.For<BasicOptions>()
    .UsingFactoryMethod(_ => Program.ParseOptions(new BasicOptions())));

(不确定这是否是代表的最佳实现,因为我已经有了new BasicOptions()。但这就是我想出的。请建议你是否知道更好的方法。)

实际问题是一次性注册所有这些选项对象,但按惯例注册时似乎无法使用委托:

container.Register(Classes.FromThisAssembly().BasedOn<ICommandLineOptions>());

(所有选项类都有ICommandLineOptions接口,就像标记一样。接口中没有任何内容。)

在这里,我找不到说“在注册选项对象之前解析它们”的方法。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

我认为你可以使用这样的东西:

container.Register(
        Classes.FromThisAssembly().BasedOn<ICommandLineOptions>().Configure(c => c.UsingFactoryMethod((kernel,context) => Program.ParseOptions(new BasicOptions())));

如果您不需要内核或上下文,您可以像上面一样使用_。

亲切的问候, Marwijn。

===编辑===

使用上下文:

container.Register(
        Classes.FromThisAssembly().BasedOn<ICommandLineOptions>().Configure(
            c => c.UsingFactoryMethod((kernel, context) =>
                    Program.ParseOptions(Activator.CreateInstance(context.RequestedType))
                )
            ));

或者,如果解析函数不创建新对象但只填充属性,则可以执行以下操作:

container.Register(
    Classes.FromThisAssembly().BasedOn<ICommandLineOptions>().Configure(
        c => c.OnCreate((kernel, instance) => Program.ParseOptions(instance)))