2010-03-22 25 views
2

当Windsor实例化类型时,是否可以执行一些自定义处理?Castle 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。由于“开始”代码(即自定义处理)是相同的,所以将这个逻辑移出每个类别将是很好的。

谢谢! Brian

回答

5

你的意思是像OnCreate方法?

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

单身人士是默认的生活方式,所以你不必明确说明。

但是请注意,与可启动设施的工作方式相比,此处的行为略有不同。

  • 组件可启动时,它会尽快实例化并由容器自身启动(当所有必需的依赖关系变为可用时)。
  • OnCreate在您的组件从容器返回之前被调用,但它并不主动创建它。所以如果永远不会拉这个组件,它的OnCreate将不会被调用。

此外,虽然文档状态,OnCreate住在设施,它不是真的了(是的,我们需要更新文档)。这种方法可以开箱即用。

+0

+1,但与容器无关的解决方案是装饰器:) – 2010-03-22 18:45:02

+1

我不确定装饰器。你会把逻辑放在哪里?在.ctor?一旦你的组件被完全实例化了,如果你想让它被执行,也就是说属性连接起来了呢? 第一次打电话给任何方法时懒惰地打电话给它?不知道这是个好主意。 – 2010-03-22 18:58:09

+0

谢谢Krysztof。对于其他读者,在版本2.1.0中添加了OnCreate方法。 – 2010-03-22 21:00:00

相关问题