我试图使用Ninject自动注册AutoMapper配置文件。为此,我需要实例化从AutoMapper.Profile继承的类型的对象,例如:
public class WordMapping : Profile
{
protected override void Configure()
{
Mapper.CreateMap<Datacontext.Entities.Word, Domain.Entities.Word>();
Mapper.CreateMap<Domain.Entities.Word, Datacontext.Entities.Word>();
}
}
首先,我试图通过反思来做到这一点,它就像一个魅力:
var profileType = typeof(AutoMapper.Profile);
var profiles = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(a => a.GetTypes())
.Where(t => profileType.IsAssignableFrom(t) && t.GetConstructor(Type.EmptyTypes) != null)
.Select(Activator.CreateInstance)
.Cast<Profile>();
foreach (var profile in profiles)
{
Mapper.AddProfile(profile);
}
但是当我尝试用Ninject做同样的事情时:
public class MappingModules : NinjectModule
{
public override void Load()
{
Kernel.Bind(scanner =>
{
scanner.FromAssembliesMatching("*")
.SelectAllClasses()
.InheritedFrom<AutoMapper.Profile>();
});
var profiles = Kernel.GetAll<Profile>();
foreach (var profile in profiles)
{
Mapper.AddProfile(profile);
}
}
}
我收到错误:
SetUp:Ninject.ActivationException:使用激活配置文件时出错 可以使用Profile No构造函数的隐式自绑定 创建实现类型的实例。
激活路径:1)请求个人资料
建议:1)确保实施类型具有公开性 构造函数。 2)如果您已实现Singleton模式,请使用a 与InSingletonScope()绑定。
我怀疑这是因为Ninject尝试实例化Mapper.Profile本身,但它没有公共构造函数。但是,当我将.InheritedFrom<AutoMapper.Profile>()
更改为.Where(p => p.IsAssignableFrom(typeof(AutoMapper.Profile)) && p != typeof(AutoMapper.Profile))
时,它也没有任何帮助。
值得一提的是Ninject的作品根,Ninject&#39;从AutoMapper.Profile
继承的模块和类位于3个不同的程序集中。
请帮我弄清楚我错过了什么。
答案 0 :(得分:5)
缺少基于约定的约束....绑定!
在条件绑定的末尾添加.BindBase()
。
Kernel.Bind(scanner =>
{
scanner.FromAssembliesMatching("*")
.SelectAllClasses()
.InheritedFrom<AutoMapper.Profile>()
.BindBase();
});
BindBase()
会将类绑定到它的直接基类,在您的示例中(WordMapping : Profile
)是Profile
。如果您的继承层次结构为WordMapping : MyMapping : Profile
,它将绑定到MyMapping
(这对您来说不合适)。
因此,如果您需要将其绑定到其他类型,请查看https://github.com/ninject/ninject.extensions.conventions/wiki/Projecting-Services-to-Bind