我有一个基本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;这种功能,但如果可能的话,我更喜欢没有其他图书馆的方式。
答案 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,您还可以查看其源代码,看看它是如何完成的,并复制相关部分! ; - )