2011-07-14 22 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! –