我正在尝试自动注册AutoMapper配置文件与Ninject。为此,我需要实例化从AutoMapper继承的类型的对象。配置文件,例如:
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。激活配置文件使用错误配置文件的隐式自绑定没有构造函数可用创建一个实现类型的实例
激活路径:1)请求配置文件
建议:1)确保实现类型有public构造函数。2)如果你已经实现了单例模式,使用a用InSingletonScope()代替。
我怀疑这是因为Ninject试图实例化Mapper。配置文件本身,但它没有公共构造函数。但是当我把.InheritedFrom<AutoMapper.Profile>()
变成.Where(p => p.IsAssignableFrom(typeof(AutoMapper.Profile)) && p != typeof(AutoMapper.Profile))
时,它也没有帮助。
值得一提的是,Ninject的组合根,Ninject的模块和类继承自AutoMapper.Profile
位于3个不同的程序集中。
请帮我弄清楚我错过了什么
缺少基于约定的绑定....绑定!在条件绑定的末尾添加一个.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