AutoMapper DependencyInjection变得简单

时间:2017-09-18 23:49:56

标签: dependency-injection automapper

我正在尝试使用带有依赖注入的AutoMapper,这是一种简单的方法。假设我有一个包含15个属性的Source和Destination类。做一些属性的映射,我想使用DependencyInjection来使用服务。 我在网上看到的所有示例都使用ValueResolver(或整个类的TypeResolver)进行描述,您可以在其中执行构造函数DI。

Snippet看起来像这样(使用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的属性创建一个解析器类。

我可能遗漏了一些东西,但我似乎找不到在AutoMapper中输入Lambda Expression-Mapping的方法,使用DI提供程序来提供接口的实现。

所以我想要这样的事情:

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

1 个答案:

答案 0 :(得分:0)

所以......我设法创建了一个扩展方法,它给了我这样的语法:

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

Extension方法如下所示:

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语法改进?