2010-03-08 10 views
2

J'utilise AutoMapper depuis un certain temps maintenant. J'ai une configuration de profil comme ceci:IoC avec profil AutoMapper utilisant Autofac

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

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

     } 
    } 

j'ajouter à l'mappeur en utilisant l'appel suivant:

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

Cependant, je veux maintenant passer une dépendance dans le constructeur ViewModelAutoMapperConfiguration à l'aide IoC. J'utilise Autofac. J'ai lu l'article ici: http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/05/11/automapper-and-ioc.aspx mais je ne vois pas comment cela fonctionnerait avec les profils.

Des idées? Merci

Répondre

1

Eh bien, j'ai trouvé une façon de le faire en utilisant une surcharge de AddProfile. Il y a une surcharge qui prend une instance d'un profil, donc je peux résoudre l'instance avant de la passer dans la méthode AddProfile.

0

Un client à moi se demandait la même chose que DownChapel and his answer m'a déclenché en écrivant un exemple d'application.

Ce que j'ai fait est le suivant. Récupérez d'abord tous les types Profile à partir des fichiers asseblies et enregistrez-les dans le conteneur IoC (j'utilise Autofac).

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

Alors que l'enregistrement de la configuration AutoMapper je résoudre tous les types Profile et résoudre une instance d'eux.

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); 
     } 
    }); 
} 

De cette façon, votre-cadre IoC (Autofac) résoudra toutes les dépendances du Profile, donc il peut avoir des dépendances.

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))) 
      ; 
    } 
} 

L'exemple d'application complète se trouve sur GitHub, mais la plupart du code est partagé importante ici.