设置
我有一个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)无效。 _repo
字段设置为公共(public)属性,并添加[Inject]
属性。仍在获取NullReferenceException
。 [Inject]
的构造函数上添加了IRepository
属性。仍在获取NullReferenceException
。 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/