C# 如何将AutoMapper与Ninject.Web.Mvc一起使用? 安装程序
我有一个设置自动映射映射的C# 如何将AutoMapper与Ninject.Web.Mvc一起使用? 安装程序,c#,dependency-injection,inversion-of-control,ninject,automapper,C#,Dependency Injection,Inversion Of Control,Ninject,Automapper,我有一个设置自动映射映射的AutoMapperConfiguration静态类: static class AutoMapperConfiguration() { internal static void SetupMappings() { Mapper.CreateMap<long, Category>.ConvertUsing<IdToEntityConverter<Category>>(); } } IdToEn
AutoMapperConfiguration
静态类:
static class AutoMapperConfiguration()
{
internal static void SetupMappings()
{
Mapper.CreateMap<long, Category>.ConvertUsing<IdToEntityConverter<Category>>();
}
}
IdToEntityConverter
在其构造函数中获取一个IRepository
,以便通过访问数据库将ID转换回实际实体。请注意,它没有默认构造函数
在我的ASP.NET的Global.asax
中,这是我在ApplicationStarted()和CreateKernel()上的功能:
仍在获取NullReferenceException
问题:
我的问题是,如何让Ninject将IRepository
注入IdToEntityConverter
?您必须让AutoMapper访问DI容器。我们使用StructureMap,但我想下面的内容应该适用于任何DI
我们使用它(在我们的一个引导程序任务中)
专用IContainer\u容器//结构映射容器
初始化(映射=>
{
map.ConstructionServicesUsing(_container.GetInstance);
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.ConstructionServicesUsing
,因为该方法除了类型之外还有一个params
参数。但是由于params是可选的,您可以只创建lambda表达式来生成一个匿名函数来获取所需的内容。如何初始化kernel
?
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;
}
public class RepositoryController : Controller
{
static RepositoryController()
{
AutoMapperConfiguration.SetupMappings();
}
}
private IContainer _container; //Structuremap container
Mapper.Initialize(map =>
{
map.ConstructServicesUsing(_container.GetInstance);
map.AddProfile<MyMapperProfile>();
}
IKernel kernel = null; // Make sure your kernel is initialized here
Mapper.Initialize(map =>
{
map.ConstructServicesUsing(t => kernel.Get(t));
});