温莎城堡:如何通过委托方式按惯例注册
本文关键字:委托方 按惯例 注册 何通过 城堡 | 更新日期: 2023-09-27 18:19:58
我正在编写命令行应用程序,并使用Castle Windsor作为DI。温莎城堡对我来说是新的,决定学习另一个DI容器。否则,我通常使用Autofac。
我试图按照约定注册我的命令行选项对象,但在注册它们之前,我需要解析它们。
以下是简单注册的工作原理:
container.Register(Component.For<BasicOptions>()
.UsingFactoryMethod(_ => Program.ParseOptions(new BasicOptions())));
(不确定这是否是委托的最佳实现,因为我已经有了new BasicOptions()
。但这就是我想到的。如果你知道更好的方法,请提出建议。)
实际的问题是一次性注册所有这些选项对象,但在按照约定注册时,我似乎无法使用委托:
container.Register(Classes.FromThisAssembly().BasedOn<ICommandLineOptions>());
(所有选项类都有ICommandLineOptions
接口,就像一个标记。接口中没有任何内容。)
在这里,我找不到一种方法来说"在注册Options对象之前,解析它们"。有什么建议吗?
我认为你可以使用这样的东西:
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)))