2010-03-08 5 views
2

나는 얼마 전에 AutoMapper를 사용 해왔다. 나는 프로필 설정과 같이이 있습니다IoC와 Autofac을 사용하는 AutoMapper 프로필

public class ViewModelAutoMapperConfiguration : Profile 
    { 
     protected override string ProfileName 
     { 
      get { return "ViewModel"; } 
     } 

     protected override void Configure() 
     { 
      AddFormatter<HtmlEncoderFormatter>(); 
      CreateMap<IUser, UserViewModel>(); 

     } 
    } 

나는 다음과 같은 호출을 사용하여 매퍼이 추가 :

Mapper.Initialize(x => x.AddProfile<ViewModelAutoMapperConfiguration>()); 

그러나, 지금의 IoC를 사용하여 ViewModelAutoMapperConfiguration 생성자에 대한 종속성을 전달하려는. Autofac을 사용하고 있습니다. 나는이 기사를 통해 여기를 읽고있다 : http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/05/11/automapper-and-ioc.aspx 그러나 이것이 프로파일과 어떻게 작동하는지 나는 볼 수 없다.

아이디어가 있으십니까? 감사합니다.

답변

1

음, AddProfile의 오버로드를 사용하여이를 수행하는 방법을 발견했습니다. 프로필 인스턴스를 사용하는 오버로드가 있으므로 AddProfile 메서드로 전달하기 전에 인스턴스를 확인할 수 있습니다.

0

내 고객이 DownChapel and his answer이라는 샘플 응용 프로그램을 작성한 것과 같은 것을 궁금해하고있었습니다.

내가 한 것은 다음과 같습니다. 처음에 모든 Profile 유형을 asseblies에서 검색하고 IoC 컨테이너에 등록합니다 (Autofac을 사용하고 있습니다).

var loadedProfiles = RetrieveProfiles(); 
containerBuilder.RegisterTypes(loadedProfiles.ToArray()); 

AutoMapper 구성 나는 Profile 유형을 모두 해결하고 그들로부터 인스턴스를 해결하고있어 등록하는 동안.

private static void RegisterAutoMapper(IContainer container, IEnumerable<Type> loadedProfiles) 
{ 
    AutoMapper.Mapper.Initialize(cfg => 
    { 
     cfg.ConstructServicesUsing(container.Resolve); 
     foreach (var profile in loadedProfiles) 
     { 
      var resolvedProfile = container.Resolve(profile) as Profile; 
      cfg.AddProfile(resolvedProfile); 
     } 
    }); 
} 

이 방법은 당신의 IoC 프레임 워크 (Autofac)는 Profile의 모든 종속성을 해결합니다, 그래서 종속성을 가질 수 있습니다.

public class MyProfile : Profile 
{ 
    public MyProfile(IConvertor convertor) 
    { 
     CreateMap<Model, ViewModel>() 
      .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Identifier)) 
      .ForMember(dest => dest.Name, opt => opt.MapFrom(src => convertor.Execute(src.SomeText))) 
      ; 
    } 
} 

전체 샘플 응용 프로그램

GitHub에서 찾을 수 있지만 중요한 코드의 대부분은 여기에 공유됩니다.