【问题标题】:How to instruct Ninject to use a factory method for any requested subtype of a given type?如何指示 Ninject 对给定类型的任何请求子类型使用工厂方法?
【发布时间】:2016-06-01 03:49:54
【问题描述】:

我有一个基本的Dto 类型,其中有几个通用逻辑和代码(更改通知、验证等)。由于技术原因,每当我必须创建像 PersonDTO 这样的具体 DTO 类型的实例时,我都必须使用工厂方法。

var personDto = Dto.Create<PersonDTO>();
// or a non-generic variant like
var personDto = Dto.Create(typeof(PersonDTO));

现在,当我需要注入任何Dto 后代时,我怎么能要求 Ninject 使用这个工厂方法?我的意思是像

Bind<Dto>().ToMethod(ctx => Dto.Create(ctx.Request.Service));

但它不仅可以应用于基本的Dto 请求,还可以应用于任何Dto 后代类型的每个请求。

我知道我可能会使用约定 Ninject 扩展的“for all ...”类型的功能,但如果可能的话,我更喜欢没有另一个库的方法。

【问题讨论】:

  • 后来我意识到我的问题在语义上并不完全正确,因为工厂方法应该有可选的参数来传递给具体的构造函数。但是,关于 Ninject 的技术问题仍然有效,所以我暂时保持原帖不变。

标签: c# ninject factory-method


【解决方案1】:

对于每个需要可解析的类型 (IResolutionRoot.Get&lt;SomeType&gt;()),都需要有一个绑定,例如:

Bind<Dto>().To..
Bind<DtoBla>().To..

除非您将使用多种类型进行绑定,例如:

Bind<Dto,DtoBla>().To...

当您想将多个类型绑定到同一个实例时,此重载特别有用,例如,如果您想将单例FooBar : IFoo, IBar 解析为IFooIBar

现在,如果您必须执行许多非常相似的绑定,Ninject.Extensions.Conventions 只是一个库,可以让您更轻松地完成任务。你不需要使用它,你也可以自己编程类型检测(使用反射)和绑定创建。

反射部分已经在stackoverflow上一遍又一遍地覆盖,例如:

当然,如果你不想使用Ninject.Extensions.Reflection,你也可以去看看它的源代码,看看它是怎么做的,把相关的部分复制一下! ;-)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 2020-01-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多