如何使用Ninject在当前AppDomain程序集中实例化某些类型的对象?

时间:2014-03-18 11:47:24

标签: c# reflection ninject automapper

我试图使用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个不同的程序集中。

请帮我弄清楚我错过了什么。

1 个答案:

答案 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