1

Jimmy Bogart a un article sur l'utilisation Automapper with an IoC container. Il a un exemple utilisant StructureMap mais j'utilise Unity et je ne suis pas sûr comment utiliser un InjectionConstructor correctement. Ci-dessous est le code de l'article et ci-dessous c'est ma pauvre tentative. Quelqu'un peut-il me dire comment le faire correctement?Comment faire ceci dans Unity?

public class ConfigurationRegistry : Registry 
{ 
    public ConfigurationRegistry() 
    { 
     ForRequestedType<Configuration>() 
      .CacheBy(InstanceScope.Singleton) 
      .TheDefault.Is.OfConcreteType<Configuration>() 
      .CtorDependency<IEnumerable<IObjectMapper>>().Is(expr => expr.ConstructedBy(MapperRegistry.AllMappers)); 

     ForRequestedType<IConfigurationProvider>() 
      .TheDefault.Is.ConstructedBy(ctx => ctx.GetInstance<Configuration>()); 

     ForRequestedType<IConfiguration>() 
      .TheDefault.Is.ConstructedBy(ctx => ctx.GetInstance<Configuration>()); 
    } 
} 

Ma tentative:

container.RegisterType<IConfiguration, Configuration>(new SingletonLifetime()) 
        .Configure<InjectedMembers>() 
         .ConfigureInjectionFor<Configuration>(
          new InjectionConstructor(typeof(IEnumerable<IObjectMapper>)), MapperRegistry.AllMappers); 

Répondre

1

C'est ce que je fini par faire:

 IEnumerable<IObjectMapper> allMappers = new List<IObjectMapper>() { 
      new TypeMapMapper(TypeMapObjectMapperRegistry.AllMappers()), 
      new StringMapper(), 
      new FlagsEnumMapper(), 
      new EnumMapper(), 
      new ArrayMapper(), 
      new DictionaryMapper(), 
      new EnumerableMapper(), 
      new AssignableMapper(), 
      //new TypeConverterMapper(), 
      new NullableMapper(), 
     }; 

     container.RegisterType<Configuration>(new SingletonLifetime()) 
         .Configure<InjectedMembers>() 
          .ConfigureInjectionFor<Configuration>(
           new InjectionConstructor(allMappers)); 

    container.RegisterType<IConfigurationProvider, Configuration>(); 
    container.RegisterType<IConfiguration, Configuration>(); 
    container.RegisterType<IMappingEngine, MappingEngine>(); 

Cela fonctionne, mais si quelqu'un d'autre a une meilleure mise en œuvre, je suis toutes les oreilles et cela a encore une prime sur elle.

+0

Utilisez la méthode statique Automapper MapperRegistry.AllMappers() pour obtenir tous les mappeurs plutôt que manuellement. Mais ouais la configuration similaire que j'utilise dans SM, sauf pour la condensation de la première déclaration –

+0

Eh bien c'est une partie de mon problème. Le constructeur pour la configuration prend une IEnumerable mais la méthode statique MapperRegistry.AllMappers() renvoie un Func > –

+0

alors vous devez faire 'TypeMapObjectMapperRegistry.AllMappers()()'. La clé est le deuxième ensemble de parenthèses. Il provoque l'appel du délégué renvoyé par 'AllMappers' et renvoie' IEnumerable ':) –

Questions connexes