2011-11-13 74 views
4

如何避免需要這樣的代碼:AutoMapper如何避免初始化

public static class BusinessLogicAutomapper 
{ 
    public static bool _configured; 

    public static void Configure() 
    { 
     if (_configured) 
      return; 

     Mapper.CreateMap<Post, PostModel>(); 
     _configured = true; 
    } 
} 

在我的BL組裝,且在我的MVC應用程序調用Configure()從我Global.asax

我的意思是,我希望這樣的電話:

public PostModel GetPostById(long id) 
    { 
     EntityDataModelContext context = DataContext.GetDataContext(); 
     Post post = context.Posts.FirstOrDefault(p => p.PostId == id); 

     PostModel mapped = Mapper.Map<Post, PostModel>(post); 
     return mapped; 
    } 

Mapper.Map<TIn,TOut>產生映射,如果它不是在所有腦幹,而不必手動創建它自己(我不應該甚至知道關於這個內在工作)。我如何解決聲明式創建AutoMapper映射器的問題?

對於AutoMapper來說很自然的解決方案是需要的,但爲了避免這種初始化,擴展或架構更改也是可行的。

我使用MVC 3,.NET 4中,沒有的IoC/DI(但,至少)

+1

如果您還沒有一個CreateMap配置打電話給我們,當事情不中郵排隊應該發生什麼 - > PostModel地圖?也就是說,你在Post上重命名了一些內容,但是沒有在PostModel上重命名它? –

+0

這是一個很好的答案。 :) – bevacqua

回答

2

我完全誤解了你想在我原來的答案做。通過使用反射來實現AutoMapper的部分功能,您可以完成自己想要的任務。這將是非常有限的實用程序,越擴展它,越像AutoMapper它將是我不確定它有什麼長期價值。

我確實使用了一個小實用程序,例如您想要將我的審計框架自動化,以便將數據從實體模型複製到其關聯的審計模型。我在開始使用AutoMapper之前創建了它,並沒有將其替換。我把它稱爲ReflectionHelper,下面的代碼是對它的修改(從內存) - 它只處理簡單的屬性,但可以適應支持嵌套模型和集合(如果需要的話)。它是基於約定的,假定具有相同名稱的屬性對應並具有相同的類型。被複制到的類型中不存在的屬性將被忽略。

public static class ReflectionHelper 
{ 
     public static T CreateFrom<T,U>(U from) 
      where T : class, new 
      where U : class 
     { 
      var to = Activator.CreateInstance<T>(); 
      var toType = typeof(T); 
      var fromType = typeof(U); 

      foreach (var toProperty in toType.GetProperties()) 
      { 
       var fromProperty = fromType.GetProperty(toProperty.Name); 
       if (fromProperty != null) 
       { 
        toProperty.SetValue(to, fromProperty.GetValue(from, null), null); 
       } 
      } 

      return to; 
     } 

用作

var model = ReflectionHelper.CreateFrom<ViewModel,Model>(entity); 

    var entity = ReflectionHelper.CreateFrom<Model,ViewModel>(model); 

原始

我做我的映射,靜態構造函數。第一次引用類時,映射器將被初始化,而無需調用任何方法。然而,我並沒有將邏輯類設爲靜態,以增強它的可測試性和將它作爲依賴類的類的可測試性。

public class BusinessLogicAutomapper 
{ 
    static BusinessLogicAutomapper 
    { 
     Mapper.CreateMap<Post, PostModel>(); 
     Mapper.AssertConfigurationIsValid(); 
    } 
} 
1

查看Automapper配置文件。

我在我的Global.asax中設置了這個設置 - 它靜態運行一次,因此一切都在運行時準備就緒。

我也有1個單元測試,涵蓋所有的地圖,以檢查他們是否正確。

的一個很好的例子是Ayendes浣熊博客

https://github.com/ayende/RaccoonBlog

相關問題