2011-11-13 70 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

相关问题