Dependency injection 使用Castle Windsor解决操作委托依赖关系

Dependency injection 使用Castle Windsor解决操作委托依赖关系,dependency-injection,castle-windsor,Dependency Injection,Castle Windsor,我有一个类,其构造函数如下所示: public TimedWorker(int timerInterval, Action execute, ILogger logger) 我使用的是Castle Windsor fluent配置,虽然下面的配置有效,但我担心我解决问题的方式。是否有更好的方法使我不总是将动作委托解析为同一事物 Component .For<IWorker>() .ImplementedBy<TimedWorker>() .DependsOn

我有一个类,其构造函数如下所示:

public TimedWorker(int timerInterval, Action execute, ILogger logger)
我使用的是Castle Windsor fluent配置,虽然下面的配置有效,但我担心我解决问题的方式。是否有更好的方法使我不总是将动作委托解析为同一事物

Component
  .For<IWorker>()
  .ImplementedBy<TimedWorker>()
  .DependsOn(new { timerInterval = TimerInterval })
  .LifeStyle.Transient,

Component.For<Action>()
  .Instance(() => Resolve<SomeService>().SomeMethod())
  .LifeStyle.Transient,

Component.For<ILogger>()
  .ImplementedBy<TraceLogProvider>()
  .LifeStyle.Singleton
组件
.对于()
.由()实施
.DependsOn(新的{timerInterval=timerInterval})
.生活方式,
用于()的组件
.Instance(()=>Resolve().SomeMethod())
.生活方式,
用于()的组件
.由()实施
.单身汉

[更新]

好的,在这种情况下,毛里西奥的解决方案是最好的方法


这种方法没有错。 如果您想要比
.Instance
提供的灵活性更大,请使用
.UsingFactoryMethod


您到底关心什么?

[UPDATE]

好的,在这种情况下,毛里西奥的解决方案是最好的方法


这种方法没有错。 如果您想要比
.Instance
提供的灵活性更大,请使用
.UsingFactoryMethod


您真正关心的是什么?

如果您不需要在其他任何地方执行操作,您可以使用DynamicParameters:

Component
  .For<IWorker>()
  .ImplementedBy<TimedWorker>()
  .DynamicParameters((kernel, parameters) => {
    parameters["timerInterval"] = TimerInterval;
    parameters["execute"] = new Action(kernel.Resolve<SomeService>().SomeMethod);
  })
  .LifeStyle.Transient, ...
组件
.对于()
.由()实施
.DynamicParameters((内核,参数)=>{
参数[“timerInterval”]=timerInterval;
参数[“执行”]=新操作(kernel.Resolve().SomeMethod);
})
.生活方式。。。

如果您在其他任何地方都不需要该操作,则可以使用DynamicParameters:

Component
  .For<IWorker>()
  .ImplementedBy<TimedWorker>()
  .DynamicParameters((kernel, parameters) => {
    parameters["timerInterval"] = TimerInterval;
    parameters["execute"] = new Action(kernel.Resolve<SomeService>().SomeMethod);
  })
  .LifeStyle.Transient, ...
组件
.对于()
.由()实施
.DynamicParameters((内核,参数)=>{
参数[“timerInterval”]=timerInterval;
参数[“执行”]=新操作(kernel.Resolve().SomeMethod);
})
.生活方式。。。

我主要担心的是,我的代码假设我只需要解决一个操作,将来,如果另一个组件需要不同的操作依赖关系,我的代码将不再工作。也许如果您给它命名并使用服务覆盖,它会更可行?您也可以尝试这样的想法:不要使用服务覆盖,尽管一定要将解析器限制为仅操作委派。我主要关心的是,我的代码假设我只需要解析一个操作,将来,如果另一个组件需要不同的操作依赖项,我的代码将不再工作。也许如果您给它一个名称并使用服务覆盖,它会更可行?您还可以尝试以下想法:代替服务覆盖,但请确保将解析程序仅限于操作代理流API注册文档:Fluent API注册文档: