2016-03-21 52 views
3

我正在使用現有的解決方案。該解決方案使用Windsor IoC。我有一個AutomapperMappings.cs類,看起來像這樣:AutoMapper,遠離過時的靜態API

public class AutoMapperMappings 
{ 
    public static void Configure() 
    { 
     AutoMapper.Mapper.Configuration 
     .CreateMap<LatestUpdateModel, LatestUpdate>(); 

     AutoMapper.Mapper.Configuration 
     .CreateMap<LatestUpdate, LatestUpdateModel>(); 

     AutoMapper.Mapper.Configuration 
     .CreateMap<DownloadLinkModel, DownloadLink>(); 

     AutoMapper.Mapper.Configuration 
     .CreateMap<DownloadLink, DownloadLinkModel>(); 

     AutoMapper.Mapper.Configuration 
     .CreateMap<NavigationElementModel, NavigationElement>(); 

     AutoMapper.Mapper.Configuration 
     .CreateMap<NavigationElement, NavigationElementModel>(); 

     AutoMapper.Mapper.Configuration 
     .CreateMap<Promobox, PromoboxModel>(); 

     AutoMapper.Mapper.Configuration 
     .CreateMap<PromoboxModel, Promobox>(); 
    } 
} 

在我Global.asax,我有以下幾點:

protected void Application_Start(object sender, EventArgs e) 
{ 
    IoCContainer(); 
    ConfigureAutoMapperMappings(); 
} 

protected virtual void ConfigureAutoMapperMappings() 
{ 
    AutoMapperMappings.Configure(); 
} 

以上是給我一個警告,說我應該從靜態API移開。所以,我用Google搜索周圍,並做了一些讀數建議我改變我AutomapperMappings.cs這樣:

public class AutoMapperMappings 
{ 
    public static void Configure() 
    { 
     var config = new MapperConfiguration(cfg => 
     { 
      cfg.CreateMap<LatestUpdateModel, LatestUpdate>(); 
      cfg.CreateMap<LatestUpdate, LatestUpdateModel>(); 
      cfg.CreateMap<DownloadLinkModel, DownloadLink>(); 
      cfg.CreateMap<DownloadLink, DownloadLinkModel>(); 
      cfg.CreateMap<NavigationElementModel, NavigationElement>(); 
      cfg.CreateMap<NavigationElement, NavigationElementModel>(); 
      cfg.CreateMap<Promobox, PromoboxModel>(); 
      cfg.CreateMap<PromoboxModel, Promobox>(); 
     }); 
    } 
} 

這是所有好的,但可變var config實際上並沒有在任何地方使用,所以我敢肯定,我需要做一些更多的東西,但我不知道我需要改變和在哪裏。

+1

https://github.com/AutoMapper/AutoMapper/wiki/Migrating-from-static-API –

+0

感謝@VadimMartynov,那StructureMap的東西讓我很困惑。我沒有這些,我沒有爲我的IoC使用StructureMap。 Windows IoC看起來簡單得多(因爲我看不到任何在我的'IoCContainer'方法 – Ciwan

回答

5

有教程"Migrating from static API"

您需要創建mapper對象並將其註冊到IoC容器:

public class AutoMapperMappings 
{ 
    public static void Configure(IWindsorContainer container) 
    { 
     var config = new MapperConfiguration(cfg => 
     { 
      cfg.CreateMap<LatestUpdateModel, LatestUpdate>(); 
      ... 
     }); 

     var mapper = config.CreateMapper(); 

     // register your mapper here. 
     container.Register(Component.For<IMapper>().Instance(mapper)); 
    } 
} 

現在,你可以注入你的映射到需要映射實體類:

public class ExampleClass 
{ 
    private readonly IMapper _mapper; 
    public ExampleClass(IMapper mapper) 
    { 
     _mapper = mapper; 
    } 

    public void DoWork() 
    { 
     var model = new LatestUpdateModel(); 
     ... 
     var update = mapper.Map<LatestUpdateModel, LatestUpdate>(model); 
    } 
} 

這個遷移將幫助你通過創建模擬對象到IMapper接口,使您的代碼更易於測試。

+0

完美工作,非常感謝。 – Ciwan

0

我想看看吉米Bogards(Automapper創建者)張貼在這裏:

https://lostechies.com/jimmybogard/2016/01/21/removing-the-static-api-from-automapper/

IMapper mapper = config.CreateMapper(); 

的配置可以用來返回IMappper接口,可以爲測試而使用更方便,創造新映射等

+0

中複雜的東西,所以我改變我的'Configure()'方法返回'IMapper映射器'?現在它是'void' – Ciwan

+0

創建一個IOC配置,您可以使用它將IMapper注入類中。 –