Csharp/C#教程:如何将AutoMapper与Ninject.Web.Mvc一起使用?分享


如何将AutoMapper与Ninject.Web.Mvc一起使用?

建立

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

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

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

 class IdToEntityConverter : ITypeConverter where T : Entity { private readonly IRepository _repo; public IdToEntityConverter(IRepository repo) { _repo = repo; } public T Convert(ResolutionContext context) { return _repo.GetSingle(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().To(); return kernel; } 

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

问题

每当我运行此代码并尝试让AutoMapper将类别ID转换回类别实体时,我会得到一个AutoMapperMappingException ,它表示IdToEntityConverter上不存在默认构造IdToEntityConverter

尝试

  1. IdToEntityConverter添加了默认构造IdToEntityConverter 。 现在我得到一个NullReferenceException ,它向我表明注入不起作用。

  2. 将private _repo字段设置为公共属性并添加[Inject]属性。 仍然得到NullReferenceException

  3. 在带有IRepository的构造函数上添加了[Inject]属性。 仍然得到NullReferenceException

  4. 考虑到Ninject可能无法拦截OnApplicationStarted()AutoMapperConfiguration.SetupMappings()调用,我将其移动到我知道正确注入的东西,我的一个控制器,如下所示:

     public class RepositoryController : Controller { static RepositoryController() { AutoMapperConfiguration.SetupMappings(); } } 

    仍然得到NullReferenceException

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

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

我们使用它(在我们的一个Bootstrapper任务中)……

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

@ ozczecho的回答是现实的,但是我发布了代码的Ninject版本,因为它有一个小小的警告,抓住了我们一段时间:

 IKernel kernel = null; // Make sure your kernel is initialized here Mapper.Initialize(map => { map.ConstructServicesUsing(t => kernel.Get(t)); }); 

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

上述就是C#学习教程:如何将AutoMapper与Ninject.Web.Mvc一起使用?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/986958.html

(0)
上一篇 2021年12月22日
下一篇 2021年12月22日

精彩推荐