1

У Джимми Богарта есть статья об использовании Automapper with an IoC container. У него есть пример с использованием StructureMap, но я использую Unity, и я не уверен, как правильно использовать InjectionConstructor.Как это сделать в 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>()); 
    } 
} 

Моя попытка:

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

ответ

1

Это то, что я в конечном итоге делает:

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

Это работает, но если кто-то имеет более эффективной реализации я все уши и на этом все еще есть щедрость.

+0

Использовать метод Automapper MapperRegistry.AllMappers(), чтобы получить все карты, а не вручную. Но да, аналогичная настройка, которую я использую в SM, за исключением конденсации первого оператора – 2009-08-01 16:41:17

+0

Ну, это часть моей проблемы. Конструктор для конфигурации принимает IEnumerable , но статический метод MapperRegistry.AllMappers() возвращает Func > –

+0

, тогда вы будете делать 'TypeMapObjectMapperRegistry.AllMappers()()'. Ключ - это второй набор скобок. Это заставляет делегата, возвращаемого из 'AllMappers', вызываться и возвращать' IEnumerable ':) –

Смежные вопросы