如何指示 Ninject 对给定类型的任何请求子类型使用工厂方法

本文关键字:类型 任何请 求子 方法 工厂 何指示 指示 Ninject | 更新日期: 2023-09-27 18:35:19

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

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 扩展的约定"对于所有人......"一种功能,但如果可能的话,我宁愿想要一种没有另一个库的方法。

如何指示 Ninject 对给定类型的任何请求子类型使用工厂方法

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

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

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

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

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

现在,如果你必须做很多非常相似的绑定,Ninject.Extensions.TConvention只是一个库,让你的任务更容易。您不需要使用它,也可以自己编程类型检测(使用反射)和绑定创建。

反射部分在stackoverflow上被一遍又一遍地覆盖了很多次,例如:

  • .NET 3.5 中生成具有反射的子类列表
  • 在 C# 中注册类的所有已声明子类
  • 获取某个类型的所有派生类型
  • 在程序集中搜索所有子类型?

当然,如果你不想使用 Ninject.Extensions.Reflection,你也可以去看看它的源代码,看看它是如何完成的,并复制相关部分!;-)

相关文章: