2011-07-14 96 views
4

我刚开始在我的MVC 3项目中使用AutoMapper,我想知道这里的人们在使用它时如何构建它们的项目。我创建了一个MapManager,它只有一个SetupMaps方法,我在global.asax中调用以创建初始地图配置。我还需要使用ValueResolver作为我的映射之一。对我而言,这个特定的ValueResolver将需要在几个不同的地方,并且只会从Article.GenerateSlug返回一个值。MVC 3:AutoMapper和项目/解决方案结构

所以我的问题是:

  1. 你如何管理你所有的地图(Mapper.CreateMap)的初始创建?
  2. 你在哪里把ValueResolver的课程放在你的项目中?你是否在你的模型文件夹或其他东西下创建子文件夹?

感谢您的帮助。

回答

3

我不会对问题2说话,因为它真的是个人偏好,但对于1我通常使用一个或多个AutoMapper.Profile来为特定目的(domaintoviewmodel等)保留我的所有Mapper.CreateMap

public class ViewModelToDomainAutomapperProfile : Profile 
{ 
    public override string ProfileName 
    { 
     get 
     { 
      return "ViewModelToDomain"; 
     } 
    } 

    protected override void Configure() 
    { 
     CreateMap<TripRegistrationViewModel, TripRegistration>() 
      .ForMember(x=>x.PingAttempts, y => y.Ignore()) 
      .ForMember(x=>x.PingResponses, y => y.Ignore()); 
    } 
} 

然后我创建一个配置映射,将我所有的配置文件的引导程序(IInitializer)。

public class AutoMapperInitializer : IInitializer 
{ 
    public void Execute() 
    { 
     Mapper.Initialize(x => 
          { 
           x.AddProfile<DomainToViewModelAutomapperProfile>(); 
           x.AddProfile<ViewModelToDomainAutomapperProfile>(); 
          }); 
    } 
} 

然后在我的Global.asax我得到的IInitializer和循环所有实例贯穿其中Execute()

foreach (var initializer in ObjectFactory.GetAllInstances<IInitializer>()) 
      { 
       initializer.Execute(); 
      } 

这是我的一般策略。


通过请求,这里是最后一步的反射实现。

var iInitializer = typeof(IInitializer); 

List<IInitializer> initializers = AppDomain.CurrentDomain.GetAssemblies() 
    .SelectMany(s => s.GetTypes()) 
    .Where(p => iInitializer.IsAssignableFrom(p) && p.IsClass) 
    .Select(x => (IInitializer) Activator.CreateInstance(x)).ToList(); 

foreach (var initializer in initializers) 
{ 
    initializer.Execute(); 
} 
+0

我喜欢这个样子。我确实有一个问题。我不知道“ObjectFactory.GetAllInstances”是什么。从谷歌搜索,它似乎是StructureMap的一部分。我从来没有使用过,所以有一个.NET的BCL相当于'ObjectFactory.GetAllInstances'?感谢你的回答。 :) –

+1

如果您不使用ioc容器,请启动。结构图是我主要使用的,但也有其他的。我已经用.net反思的方式更新了我的答案。它非常简单。 –

+0

非常感谢,Nathan! –