2017-02-19 41 views
0

Как сообщить AutoMapper 5 использовать StructureMap для построения служб без создания проблемы начальной загрузки, то есть new MapperConfiguration(cfg => cfg.ConstructServicesUsing(some_IContainer)), когда конфигурация выполняется через StructureMap?Загрузочный автомодель и структураМатериалы через ConstructServicesUsing

Пользовательские преобразователи нуждаются в локаторе обслуживания, который будет использоваться AutoMapper, но IContainer еще не существует, пока AutoMapper инициализируется внутри реестра StructureMap. Статический ObjectFactory.Container устарели в StructureMap, так что я ленивый ObjectFactory:

public static class ObjectFactory 
{ 
    private static readonly Lazy<Container> _containerBuilder = 
      new Lazy<Container>(defaultContainer, LazyThreadSafetyMode.ExecutionAndPublication); 

    public static IContainer Container 
    { 
     get { return _containerBuilder.Value; } 
    } 

    private static Container defaultContainer() 
    { 
     return new Container(x => 
     { 
      x.AddRegistry<MyRegistry>(); // AutoMapper is configured here 
     }); 
    } 
} 

Я не могу ссылаться на ObjectFactory.Container из профиля AutoMapper потому что я получаю переполнение стека или «Значение, на который ссылается внутри ленивый завод».

Есть ли способ зацепить на .ConstructUsing(some_IContainer) после настройки AutoMapper?

ответ

0

Вы можете использовать контейнер - даже если он еще не построен - с помощью lamdba-based registrations.

Ваша регистрация MapperConfiguration может выглядеть примерно так:

class MyRegistry : Registry 
{ 
    public MyRegistry() 
    { 
     For<MapperConfiguration>() 
      .Use("Use StructureMap context to resolve AutoMapper services", ctx => 
      { 
       return new MapperConfiguration(config => 
       { 
        config.ConstructServicesUsing(type => ctx.GetInstance(type)); 
       }); 
      }); 
    } 
} 

Таким образом, вы избежите проблему курицы и яйца.

ПРЕДУПРЕЖДЕНИЕ

Я не проверял этот код, и я не знаком с StructureMap.