Windsor Castle 相当于 Autofac 的 IStartable

Windsor Castle Equivalent of Autofac's IStartable

我希望能够在我的温莎城堡容器设置中实现它:

"For all types that implement IStartable in the current assembly register them and run the Start method for them."

类似于您可以使用 Autofac 执行的操作,例如注册 Automapper 映射。例如

    public class MyBlahViewModelMapper : IStartable
{
    public void Start()
    {
        Mapper.CreateMap<MyBlahEntity, MyBlahViewModel>();
    }
}

Autofac 会自动执行...。我在想 Windsor 不能帮我吗?

最接近的是 Castle Windows Installers - 它们可以简单地从程序集中扫描并安装(或 'started')。安装程序通常用于注册组件,但也可用于其他初始化。

Windsor uses installers (that is types implementing IWindsorInstaller interface) to encapsulate and partition your registration logic .. FromAssembly [makes] working with installers a breeze.

创建安装程序后,使用主 IoC 中的流畅配置之一 bootstrap,例如:

container.Install(
   FromAssembly.This());

注意顺序未指定;必须按顺序出现的安装程序必须使用明确的安装顺序指定,可能通过修改后的程序集反射器。

温莎拥有自己的 IStartable 界面。如果您希望 Windsor 注册您的对象并在之后立即 create/run 它们,您将为此使用 Startable Facility

澄清一下,这里有两个概念:

  1. IStartable接口,提供StartStop方法。这是一个提供生命周期回调的生命周期接口:Start 在创建组件实例后立即调用(在构造函数运行后)

  2. 可启动工具,强制您的 IStartable 组件在安装程序具有 运行.

  3. 后立即实例化和启动

代码如下所示:

container.AddFacility<StartableFacility>(f => f.DeferredStart());
container.Install(FromAssembly.This());
// by here all startable are started

如果您使用的是 Windsor 3.3 或更高版本,您还可以手动触发 startables 启动(如果您需要为它们做一些额外的设置,这很有用)

var flag = new StartFlag();

container.AddFacility<StartableFacility>(f => f.DeferredStart(flag));
container.Install(FromAssembly.This());
// do whatever else set up your app needs

// when ready, signal the flag
flag.Signal();
// by here all startable are started