2017-09-18 6 views
0

私はAutoMapperをDependency Injectionで簡単に使用しようとしています。 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表現マッピングを入力する方法を見つけることができません。

だから私はこのような気にいらたいと思います:

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

これはちょうどいいですね。誰かが私が見逃していることを教えてもらえますか、あるいはAutoMapperは単にDI構文の改善を必要としていますか?

関連する問題