2017-09-18 7 views
0

나는 AutoMapper를 의존성 삽입과 함께 사용하려고합니다. 쉬운 방법입니다. 15 가지 속성을 가진 Source 및 Destination 클래스가 있다고 가정 해 보겠습니다. 일부 속성의 매핑을 수행 할 때 DependencyInjection을 사용하여 서비스를 사용하려고합니다. 그물에서 본 모든 예는 생성자 DI를 수행 할 수있는 ValueResolver (또는 전체 클래스에 대해 TypeResolver)를 사용하여 설명합니다.AutoMapper DependencyInjection을 쉽게 만들었습니다.

발췌문은 다음과 같습니다 (사용 AutoMapper 3.3.1 구문하지만 개념은 여전히 ​​남아있다) :

public class SourceMapping : Profile 
{ 
    protected override void Configure() 
    { 
     CreateMap<Source, Destination>().ForMember(x => x.Value, opt => opt.ResolveUsing<ValueResolver>()); 
    } 

    class ValueResolver : IValueResolver 
    { 
     private IValueSupplier _valueSupplier; 

     public ValueResolver(IValueSupplier valueSupplier) 
     { 
      _valueSupplier = valueSupplier; 
     } 

     public ResolutionResult Resolve(ResolutionResult source) 
     { 
      Source src = (Source) source.Value; 
      return source.New(_valueSupplier.Value * src.MyValue); 
     } 
    } 
} 

이러한 접근 방식은 각각의 DI이 필요한 모든 속성에 대한 해결-클래스를 만드는 나를 강제로.

내가 누락되었지만 DI 구현자를 사용하여 인터페이스 구현을 제공하는 AutoMapper에서 Lambda Expression-Mapping을 입력 할 수있는 방법을 찾을 수없는 것 같습니다.

그래서 나는 이런 식으로 뭔가를해야만 할 것 : 그래서

protected override void Configure() 
    { 
     CreateMap<Source, Destination>().ForMember(x => x.Value, opt => opt.MapFrom(src => opt.GetInstance<IValueSupplier>().Value * src.MyValue)); 
    } 

답변

0

.... 내가 나에게이 구문주는 확장 메서드 생성 관리 :

protected override void Configure() 
    { 
     CreateMap<Source, Destination>().ForMember(x => x.Value, opt => opt.MapFrom(src => opt.Service().OfType<IValueSupplier>().Value * src.MyValue)); 
    } 

확장 방법처럼 보일를 이 :

public static class Extensions 
{ 
    public static ServiceProvider Service<TSource>(this IMemberConfigurationExpression<TSource> mapper) 
    { 
     var field = mapper.GetType().GetField("_serviceCtor", BindingFlags.Instance | BindingFlags.NonPublic); 
     Func<Type, object> kernelFunc = field.GetValue(mapper) as Func<System.Type, object>; 
     return new ServiceProvider(kernelFunc); 
    } 

    public class ServiceProvider 
    { 
     private Func<Type, object> _kernelFunc; 

     public ServiceProvider(Func<Type, object> kernelFunc) 
     { 
      _kernelFunc = kernelFunc; 
     } 

     public T OfType<T>() 
     { 
      return (T)_kernelFunc.Invoke(typeof(T)); 
     } 
    } 
} 

하지만 이것은 역겨운 일입니다. 맞습니까? 아무도 내가 놓친 것을 말해 줄 수 있습니까, 아니면 단순히 DI 구문 개선이 필요한 AutoMapper입니까?