2010-05-23 92 views
10

我经常使用AutoMapper将模型(域)对象映射到ViewModel对象,ViewModel对象然后被我的视图在模型/视图/视图模型模式中使用。'CreateMap'语句应该去哪里?

这涉及许多'Mapper.CreateMap'语句,所有这些语句都必须执行,但只能在应用程序的生命周期中执行一次。从技术上讲,我应该把它们全部放在某个地方的静态方法中,这个方法从我的Application_Start()方法(这是一个ASP.NET MVC应用程序)中调用。

但是,在一个中心位置将许多不同的映射关系组合在一起似乎是错误的。

特别是当映射代码变得复杂并涉及格式化和其他逻辑时。

是否有更好的方法来组织映射代码,以便它保持接近它所关注的ViewModel?

(我想出了一个主意 - 有每个视图模型一个“CreateMappings”的方法,并在BaseViewModel,呼吁实例这种方法。然而,由于该方法只应调用一旦在应用程序生命周期。它需要一些额外的逻辑来缓存已经调用了CreateMappings方法的ViewModel类型列表,然后仅在必要时调用它,以便不在该列表中的ViewModel。)

回答

2

如果使用配置文件,您可以将所有的“CreateMap”调用放在那里。另外,您可以创建一个包含您的配置的静态引导程序类,并让启动部分调用引导程序。

+0

但仍然没有解决具有混为一谈所有不同的视图模型的所有映射的问题,当我宁愿有他们以某种方式与他们适用的课程有关。 – Jonathan 2010-05-24 00:36:32

0

OK,现在我做的方式是这样的:

我添加一些逻辑来我BaseController,它运行“CreateMappings”方法的构造,但只有一次,每控制器类型:

public abstract class BaseController : Controller 
{  
    public BaseController() 
    { 
     if (!controllersWithMappingsCreated.Contains(GetType())) 
     { 
      CreateMappings(); 
      controllersWithMappingsCreated.Enqueue(GetType()); 
     } 
    } 

    protected virtual void CreateMappings() { } 
} 

在每个具体控制器中,我使用CreateMappings来声明与该控制器相关的所有Models/ViewModel的映射。

public class AccountController : BaseController 
{ 
    public AccountController() : base() { } 

    protected override void CreateMappings() 
    { 
     Mapper.CreateMap<Models.User, ViewModels.UserProfile>(); 
     Mapper.CreateMap<Models.User, ViewModels.ChangePassword>(); 
    } 
} 

我也发现了涉及属性herehere,但他们打我作为一个有点过于复杂了一些有趣的选择。

+2

我仍然有一个静态引导类,所以你可以单元测试你的映射。 – Martin 2010-07-29 11:15:02

+0

不错的工作。但是'BaseController'中的'controllersWithMappingsCreated'是什么? – Blaise 2012-02-13 14:41:15

6

如果你真的不想使用引导程序,那么至少一个静态构造函数是确保你的CreateMap最多被调用一次的简单方法。 (以较少的插科打诨多线程性能要优于乔纳森的回答。)

public class AccountController : Controller 
{ 
    static AccountController() 
    { 
     Mapper.CreateMap<Models.User, ViewModels.UserProfile>(); 
     Mapper.CreateMap<Models.User, ViewModels.ChangePassword>(); 
    } 
} 
+0

我没有将映射放入静态构造函数中。我发现我必须把它们放在实例构造函数中。 – AaronLS 2012-03-29 17:40:27

+0

@AaronLS哦,不,你会得到一个例外或类似的东西吗?哪些类用于构造函数和映射? – 2012-04-04 17:19:17