2016-07-26 3 views
-1

У нас есть приложение, которое мы создаем, и у нас есть DataTranslationLayer, который отвечает за перевод объекта базы данных в объект модели представления.AutoMapper Initialize

Поскольку мы не передаем наши объекты базы данных в веб-проект, мы не можем инициализировать global.asax. Нам нужно инициализировать в DataTranslationLayer.

Проблема в том, что когда мы создаем экземпляр класса, он выполняет другую инициализацию и вызывает проблемы, поскольку AutoMapper предназначен для инициализации только один раз.

Итак, мой вопрос: кто-нибудь реализовал подобное решение и что вы сделали?

Является ли решение создать статический класс в DTL, который мы вызываем при запуске приложения, или есть более элегантное решение?

ответ

0

Статический автомастер - это всего лишь тонкий слой. Вы можете легко создать один или несколько экземпляров AutoMapper с другой конфигурацией. См. my other answer, как это сделать.

+0

Хммм, интересно. благодаря – griegs

0

Я не знаю, что это значит, что вы не передаете объекты базы данных в веб-проект, но, возможно, у вас сложная многоуровневая архитектура. В этом случае, один из способов сделать это, чтобы использовать отражение, чтобы загрузить все профили:

var assembliesToScane = AppDomain.CurrentDomain.GetAssemblies(); 
    var allTypes = assembliesToScan.SelectMany(a => a.ExportedTypes).ToArray(); 

    var profiles = 
     allTypes 
      .Where(t => typeof(Profile).GetTypeInfo().IsAssignableFrom(t.GetTypeInfo())) 
      .Where(t => !t.GetTypeInfo().IsAbstract); 

    Mapper.Initialize(cfg => 
    { 
     foreach (var profile in profiles) 
     { 
      cfg.AddProfile(profile); 
     } 
    }); 

Вы не напрямую ссылаться на какой-либо один профиль, а просто загрузить все профиля от текущего AppDomain.