2010-10-02 44 views
3

我使用Automapper在我的EF4模型和ViewModels之間進行轉換。 Automapper需要聲明地圖關係,並且我發現自己將其複製/粘貼到每個控制器的構造函數中。ASP.NET MVC 2 Automapper Placement

Mapper.CreateMap<CoolObject, CoolObjectViewModel>(); 

我在哪裏可以把每一個控制器被實例化時的映射聲明,以他們只會被調用一次,而不是?這可能嗎?

回答

5

你可以把它的global.asax

application_start()目前,我有,我從我的初始化所有映射的調用的Application_Start一個靜態方法。 Library.AutoMapping.RegisterMaps();

AutoMapper.Mapper.CreateMap(typeof(CoolObject), typeof(CoolObjectViewModel)); 

AutoMapper.Mapper.CreateMap<CoolObject, CoolObjectViewModel>() 
    .ForMember(d => d.Property1, f => f.MapFrom(s => s.Property1)) 
    .ForMember(d => d.Property2, f => f.MapFrom(s => s.Property2)) 
    .ForMember(d => d.Property3, f => f.MapFrom(s => s.Property3)); 

所以我的控制器看起來是這樣的。您會注意到HomeController構造函數需要一個IDataContext。我在RequestScope級別註冊了IDataContext和Ninject,併爲我實例化了一個DataContext並注入到了我的控制器中。這是我的請求級別資源庫的來源。

public class HomeController : Controller { 

    IDataContext dataContext; 

    public HomeController(IDataContext dataContext) { 
     this.dataContext = dataContext; 
    } 
} 

我對Ninject一個稍微詳細的說明這裏http://buildstarted.com/2010/08/24/dependency-injection-with-ninject-moq-and-unit-testing/

+0

謝謝您的回答。我的地圖依賴於初始化一個類型爲我的EF4表對象之一的存儲庫。我想按照「每個請求」的範圍對存儲庫進行範圍。如果我在我的CRUD操作中使用另一套回購協議,這些地圖是否有效? – John 2010-10-02 02:38:23

+0

這和我正在做的事情差不多。我正在使用Ninject來初始化我的存儲庫,並且我沒有任何映射問題。但是,我使用'Mapper.CreateMap(typeof(CoolOject),typeof(CoolObjectViewModel))' – Buildstarted 2010-10-02 02:48:28

+0

你在哪裏執行repo初始化,以便它是'per http request'? – John 2010-10-02 02:55:58