AutoMapper与Ninject的使用

4

我一直在尝试使用AutoMapper通过Ninject实例化所有对象。

我在global.asax文件中添加了以下代码:

Mapper.Configuration.ConstructServicesUsing(x => kernel.Get(x));

作为一个例子,我有以下映射。
Mapper.CreateMap<TestModel, IndexViewModel>();

然而,这似乎并没有起作用。我收到一个错误,说“IndexViewModel”没有默认构造函数。
我可以通过显式告诉automapper在映射中使用ninject来使映射器工作。
Mapper.CreateMap<TestModel, IndexViewModel>().ConstructUsingServiceLocator();

但我不想为每个映射都这样做。我有什么遗漏吗?

您没有提供IndexViewModel的源代码,它是否有一个默认的构造函数? - Peter Ritchie
5
为什么你的视图模型没有默认构造函数?为什么你需要使用Ninject来管理它们?没有默认构造函数的视图模型会给你带来很多麻烦。如果POST控制器操作使用这些视图模型作为操作参数呢?你将不得不为它们编写自定义的模型绑定器。听起来很复杂。 - Darin Dimitrov
@Darin:使用依赖注入创建视图模型类的自定义模型绑定器并不复杂。我使用这种方法在每个视图模型(基类)中设置一些常见的基本属性。 - Jan
你是否已经在Ninject中注册了你的IndexViewModel?你能否通过显式的kernel.Get<IndexviewModel>()调用来解决它? - Damian Powell
3
关于另一个问题,我强烈建议将所有的映射配置放入AutoMapper档案中。在启动时,找到所有档案并注册它们到AM中,然后调用“Mapper.AssertConfigurationIsValid()”。最近在一个存在冲突映射的项目中,我们采用了这种模式后,减少了很多痛苦。 - Damian Powell
显示剩余4条评论
1个回答

1
只需在您的初始化代码中创建一个函数来执行此操作。
void CreateMapWithServiceLocator<T1,T2>()
{
     Mapper.CreateMap<T1,T2>().ConstructUsingServiceLocator();
} 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接