设置

我有一个AutoMapperConfiguration静态类,用于设置AutoMapper映射:

static class AutoMapperConfiguration()
{
    internal static void SetupMappings()
    {
        Mapper.CreateMap<long, Category>.ConvertUsing<IdToEntityConverter<Category>>();
    }
}

其中IdToEntityConverter<T>是如下所示的自定义ITypeConverter:
class IdToEntityConverter<T> : ITypeConverter<long, T> where T : Entity
{
    private readonly IRepository _repo;

    public IdToEntityConverter(IRepository repo)
    {
        _repo = repo;
    }

    public T Convert(ResolutionContext context)
    {
        return _repo.GetSingle<T>(context.SourceValue);
    }
}
IdToEntityConverter在其构造函数中采用IRepository,以便通过访问数据库将ID转换回实际实体。请注意,它没有默认的构造函数。

在我的ASP.NET的Global.asax中,这就是OnApplicationStarted()CreateKernel()的内容:
protected override void OnApplicationStarted()
{
    // stuff that's required by MVC
    AreaRegistration.RegisterAllAreas();
    RegisterRoutes(RouteTable.Routes);

    // our setup stuff
    AutoMapperConfiguration.SetupMappings();
}

protected override IKernel CreateKernel()
{
    var kernel = new StandardKernel();
    kernel.Bind<IRepository>().To<NHibRepository>();

    return kernel;
}

因此,OnApplicationCreated()将调用AutoMapperConfiguration.SetupMappings()来设置映射,并且CreateKernel()NHibRepository的实例绑定(bind)到IRepository接口(interface)。

问题

每当我运行此代码并尝试让AutoMapper将类别ID转换回类别实体时,我都会得到一个AutoMapperMappingException,其中说IdToEntityConverter上不存在默认构造函数。

尝试次数
  • IdToEntityConverter中添加了默认构造函数。现在,我得到一个NullReferenceException,它向我表明注入(inject)无效。
  • 将私有(private)_repo字段设置为公共(public)属性,并添加[Inject]属性。仍在获取NullReferenceException
  • 在采用[Inject]的构造函数上添加了IRepository属性。仍在获取NullReferenceException
  • 考虑到Ninject可能无法拦截AutoMapperConfiguration.SetupMappings()中的OnApplicationStarted()调用,我将其移到了我知道可以正确注入(inject)的东西上,这是我的一个 Controller ,例如:
    public class RepositoryController : Controller
    {
        static RepositoryController()
        {
            AutoMapperConfiguration.SetupMappings();
        }
    }
    

    仍在获取NullReferenceException

  • 问题

    我的问题是,我如何获得Ninject将IRepository注入(inject)IdToEntityConverter

    最佳答案

    您必须授予AutoMapper对DI容器的访问权限。我们使用StructureMap,但我想以下内容适用于任何DI。

    我们使用它(在我们的Bootstrapper任务之一中)...

        private IContainer _container; //Structuremap container
    
        Mapper.Initialize(map =>
        {
            map.ConstructServicesUsing(_container.GetInstance);
            map.AddProfile<MyMapperProfile>();
        }
    

    关于c# - 如何将AutoMapper与Ninject.Web.Mvc一起使用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4074609/

    10-10 19:31