Castle Windsor:开始服务时的自定义处理

时间:2010-03-22 18:31:54

标签: castle-windsor eventaggregator

当Windsor实例化类型时,是否可以执行一些自定义处理?

类似于:

        container.Register(
                  AllTypes.Pick()
                      .FromAssembly(Assembly.GetExecutingAssembly())
                      .BasedOn<MyMarkerInterface>()
                      .WhenInstantiating(instance => // do some stuff with this instance)
                      .Configure(component => component.Startable().LifeStyle.Singleton)
                      .WithService.Base());

目前我们正在使用IStartable。由于“开始”代码(即自定义处理)是相同的,所以将这个逻辑移出每个类是很好的。

谢谢! 布赖恩

1 个答案:

答案 0 :(得分:5)

你的意思是OnCreate方法吗?

    container.Register(
              AllTypes.FromAssembly(Assembly.GetExecutingAssembly())
                  .BasedOn<MyMarkerInterface>()
                  .WithService.Base()
                  .OnCreate((kernel, instance) => instance.CreatedAt = DateTime.Now)
);

Singleton是默认生活方式,因此您无需明确说明。

请注意,与Startable工具的工作方式相比,此处的行为略有不同。

  • 当组件可以启动时,它会尽快实例化并由容器本身启动(当所有必需的依赖项都可用时)。
  • 在从容器返回组件之前调用OnCreate,但不会主动创建它。因此,如果从不拉动此组件,则不会调用其OnCreate。

同样,虽然文档声明OnCreate住在一个设施中,但它不再是真的(是的,我们需要更新文档)。这种方法可以开箱即用。