首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将AutoMapper与Ninject.Web.Mvc结合使用?

如何将AutoMapper与Ninject.Web.Mvc结合使用?
EN

Stack Overflow用户
提问于 2010-11-02 02:54:32
回答 2查看 4.7K关注 0票数 12

设置

我有一个AutoMapperConfiguration静态类来设置AutoMapper映射:

代码语言:javascript
复制
static class AutoMapperConfiguration()
{
    internal static void SetupMappings()
    {
        Mapper.CreateMap<long, Category>.ConvertUsing<IdToEntityConverter<Category>>();
    }
}

其中IdToEntityConverter<T>是一个自定义ITypeConverter,如下所示:

代码语言:javascript
复制
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()所拥有的

代码语言:javascript
复制
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的一个实例绑定到IRepository接口。

问题

每当我运行这段代码并试图让AutoMapper将一个类别ID转换回一个类别实体时,我就会得到一个AutoMapperMappingException,它说明IdToEntityConverter上不存在默认构造函数。

尝试

  1. IdToEntityConverter添加了默认构造函数。现在我得到一个NullReferenceException,它向我表明注入不是NullReferenceException--私有_repo字段进入公共属性,并添加了[Inject]属性。仍然在接受NullReferenceException.
  2. Added的构造函数上获取[Inject]属性。虽然NullReferenceException.
  3. Thinking可能无法拦截OnApplicationStarted()中的AutoMapperConfiguration.SetupMappings()调用,但我还是把它移到了一个我知道的正确注入控制器上,比如:

公共类RepositoryController :控制器{静态RepositoryController() { AutoMapperConfiguration.SetupMappings();}

还能得到NullReferenceException.

问题

我的问题是,我如何让Ninject将一个IRepository注入到IdToEntityConverter

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-02 04:25:40

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

我们使用这个(在我们的Bootstrapper任务中)。

代码语言:javascript
复制
    private IContainer _container; //Structuremap container

    Mapper.Initialize(map =>
    {
        map.ConstructServicesUsing(_container.GetInstance);
        map.AddProfile<MyMapperProfile>();
    }
票数 8
EN

Stack Overflow用户

发布于 2012-04-25 15:51:06

@ozczecho的答案是点对点的,但我现在贴出了while版本的代码,因为它有一个小小的警告,让我们有一段时间没注意到:

代码语言:javascript
复制
IKernel kernel = null; // Make sure your kernel is initialized here

Mapper.Initialize(map =>
{
    map.ConstructServicesUsing(t => kernel.Get(t));
});

您不能只将kernel.Get传递给map.ConstructServicesUsing,因为该方法除了类型之外还有一个params参数。但是由于params是可选的,所以您可以创建lambda表达式来生成一个匿名函数来获得所需的内容。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4074609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档