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

时间:2016-02-19 14:23:50

标签: c# ninject factory-method

我有一个基本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扩展的约定#34;对于所有...&#34;这种功能,但如果可能的话,我更喜欢没有其他图书馆的方式。

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

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

在stackoverflow上反复覆盖了反射部分多次,例如参见:

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