繁体   English   中英

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

[英]Castle Windsor: How to register by convention with delegate method?

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

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

简单注册的工作原理如下:

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

(不确定这是否是委托的最佳实现,因为我已经在其中有了new BasicOptions() 。但这就是我想到的。请提出建议,如果您知道这样做的更好方法。)

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

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

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

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

我认为您可以使用以下方式:

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))
                )
            ));

或者,如果parse函数不创建新对象而是仅填充属性,则可以执行以下操作:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM