2

Я использую automapper для отображения из dtos в домен и наоборот; Я использую конвертер пользовательского типа для преобразования, но я хочу встраивать зависимости в класс конвертера, используя простой инжектор ioc; Я не могу этого сделать. скажите, пожалуйста, как это достичь?Автоматические инъекции зависимостей в преобразователь пользовательского типа с использованием простого инжектора (Ioc)

public class DtoToEntityConverter : ITypeConverter<Dto, Entity> 
{ 
    private readonly IEntityRepository _entityRepository; 

    public DtoToEntityConverter (IEntityRepository entityRepository) 
    { 
     _entityRepository = entityRepository ; 
    } 

    public Entity Convert(ResolutionContext context) 
    { 

    }  


} 
+0

Ваша прикладная служба должна получить Dto, а затем отобразить ее обратно или слить ее с помощью объекта домена. – Fals

+0

Вы имели в виду, что не использовать automapper? – yo2011

+1

Я имею в виду, не делайте код спагетти с карточками и репозиторием. Вы должны использовать репозиторий вне mapper. – Fals

ответ

8

Вам нужно настроить службы с помощью AutoMapper:

var container = ConfigureSimpleInjectorContainer(); 

Mapper.Initialize(cfg => { 
    cfg.ConstructServicesUsing(type => container.GetInstance(type)); 
    // The rest of your initialization 
}); 
+0

Thanks; он отлично работает, как ожидалось – yo2011

+0

Есть ли примеры того, как вводить зависимости в преобразователи типов с использованием .NET Core DI? Должно быть возможно использовать IServiceProvider для создания служб, используя вышеизложенное, но я не смог заставить его работать. –

1

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

public class DtoToEntityConverter : ITypeConverter<Dto, Entity> 
{ 
    private readonly IEntityRepository _entityRepository; 

    public DtoToEntityConverter (IEntityRepository entityRepository) 
    { 
     _entityRepository = entityRepository ; 
    } 

    public Entity Convert(ResolutionContext context) 
    { 

    }  
} 

Как бы вы зарегистрировать его:

Mapper.CreateMap<From, To>().ConvertUsing(new DtoToEntityConverter(Ioc.Resolve<IEntityRepository>())); 

Статический класс Ioc должен удерживать IUnitContainer где вы регистрируетесь всю свою зависимость.

public static class IoC 
{ 
    public static IUnityContainer Unity { get; private set; } 

    public static T Resolve<T>() 
    { 
     return Unity.Resolve<T>(); 
    } 

    public static T Resolve<T>(string key) 
    { 
     return Unity.Resolve<T>(key); 
    } 

    public static void Initialize(IUnityContainer unity) 
    { 
     Unity = unity; 
    } 
} 

Примечание: Сделайте это убедиться, что вы уже создали UnityContainer до отображения. Ваша проблема не типична, и вы можете рассмотреть ее перепроектирование и оставить отображение (Automapper) для сопоставления модели только модели . Но может быть, в какой-то момент у вас есть странное требование, вы можете рассмотреть этот подход.

+0

Спасибо за помощь; но предыдущее решение более элегантно – yo2011

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

  • Нет связанных вопросов^_^