2012-08-27 41 views
1

我有一個AutoMapper輪廓目前取決於UrlHelper以下映射:消除對UrlHelper的依賴?

CreateMap<Post, OpenGraphModel>().ForMember(
    m => m.Title, 
    x => x.MapFrom(p => p.Link.Title) 
).ForMember(
    m => m.Description, 
    x => x.MapFrom(p => p.Link.Description) 
).ForMember(
    m => m.Image, 
    x => x.MapFrom(p => p.Link.Picture) 
).ForMember(
    m => m.Url, 
    x => x.MapFrom(p => urlHelper.RouteUrl("PostShortcut", new { id = p.Id }, "http")) 
); 

這是罰款,直到當我想重用我AutoMapper的個人資料背景下,這是一個Web請求之外。

我能想到的這三種解決方案,其中沒有一個真正說服我(排名不分先後):

  1. 從映射輪廓完全消除UrlHelper依賴。
    這意味着我現在必須手動映射 OpenGraphModel的屬性,在我看來,這種方式擊敗了使用AutoMapper的目的。我喜歡我的映射器能夠在目標對象中設置我需要的所有屬性。

  2. 從非web上下文中刪除此映射配置文件,因爲非web請求上下文不應直接映射到直接查看模型。
    爲了做到這一點,我將不得不使我的IMapper實例或者是每個web請求(或線程)的瞬態,而不是單例,這引入了我不想引入的額外開銷。

  3. 第三種選擇是在非web請求上下文(即作業)上不使用IMapper實現,但這看起來幾乎沒有問題,因爲我重複使用最終要求我使用映射器。

我猜有2單映射器將是一個讓最有意義(其中選擇基於上下文的配置文件),但我不知道我應該怎麼做,這是我的AutoMapper安裝在它的當前形式:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Reflection; 
using AutoMapper; 
using AutoMapper.Mappers; 
using Castle.MicroKernel; 
using Castle.MicroKernel.Registration; 
using Castle.MicroKernel.SubSystems.Configuration; 
using Castle.Windsor; 

namespace Common 
{ 
    internal sealed class AutoMapperInstaller : IWindsorInstaller 
    { 
     private readonly Type[] profileTypes; 

     public AutoMapperInstaller(params Type[] profileTypes) 
     { 
      if (profileTypes == null) 
      { 
       throw new ArgumentNullException("profileTypes"); 
      } 
      this.profileTypes = profileTypes; 
     } 

     public void Install(IWindsorContainer container, IConfigurationStore store) 
     { 
      IEnumerable<Assembly> assemblies = profileTypes.Select(t => t.Assembly).ToList(); 

      foreach (Assembly assembly in assemblies) 
      { 
       container.Register(
        AllTypes 
         .FromAssembly(assembly) 
         .BasedOn(typeof (ITypeConverter<,>)) 
         .WithServiceSelf() 
        ); 
      } 

      foreach (Assembly assembly in assemblies) 
      { 
       container.Register(
        Classes 
         .FromAssembly(assembly) 
         .BasedOn<Profile>() 
         .LifestyleTransient() 
        ); 
      } 

      container.Register(
       Component 
        .For<ITypeMapFactory>() 
        .ImplementedBy<TypeMapFactory>() 
        .LifestyleTransient() 
       ); 

      container.Register(
       Component 
        .For<IConfiguration, IConfigurationProvider>() 
        .UsingFactoryMethod(InstanceConfigurationStore) 
        .LifestyleTransient() 
       ); 

      container.Register(
       Component 
        .For<IMappingEngine>() 
        .ImplementedBy<MappingEngine>() 
        .LifestyleTransient() 
       ); 

      container.Register(
       Component 
        .For<IMapper>() 
        .ImplementedBy<Mapper>() 
        .DynamicParameters(
         (k, parameters) => parameters["profileTypes"] = profileTypes 
        ) 
        .LifestyleSingleton() 
       ); 
     } 

     private ConfigurationStore InstanceConfigurationStore(IKernel kernel) 
     { 
      ITypeMapFactory typeMapFactory = kernel.Resolve<ITypeMapFactory>(); 
      IEnumerable<IObjectMapper> mappers = MapperRegistry.AllMappers(); 

      return new ConfigurationStore(typeMapFactory, mappers); 
     } 
    } 
} 

回答

1

通過嘲諷非Web請求上下文傳遞給UrlHelperRequestContext解決。

+0

你的'urlHelper'在Web請求中是如何傳遞給AutoMapper的? –