如何将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
。
尝试
-
为
IdToEntityConverter
添加了默认构造IdToEntityConverter
。 现在我得到一个NullReferenceException
,它向我表明注入不起作用。 -
将private
_repo
字段设置为公共属性并添加[Inject]
属性。 仍然得到NullReferenceException
。 -
在带有
IRepository
的构造函数上添加了[Inject]
属性。 仍然得到NullReferenceException
。 -
考虑到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