Dependency injection AutoMapper DependencyInjection轻松实现

Dependency injection AutoMapper DependencyInjection轻松实现,dependency-injection,automapper,Dependency Injection,Automapper,我正在尝试将AutoMapper与依赖项注入结合使用,这是一种简单的方法。假设我有一个具有15个属性的源类和目标类。在映射一些属性时,我想使用一个服务,使用DependencyInjection。 我在网上看到的所有示例都描述了如何使用ValueResolver(或整个类的TypeResolver),您可以在其中执行构造函数DI 代码段如下所示(使用AutoMapper 3.3.1语法,但概念仍然存在): 公共类源映射:配置文件 { 受保护的覆盖无效配置() { CreateMap().form

我正在尝试将AutoMapper与依赖项注入结合使用,这是一种简单的方法。假设我有一个具有15个属性的源类和目标类。在映射一些属性时,我想使用一个服务,使用DependencyInjection。 我在网上看到的所有示例都描述了如何使用ValueResolver(或整个类的TypeResolver),您可以在其中执行构造函数DI

代码段如下所示(使用AutoMapper 3.3.1语法,但概念仍然存在):

公共类源映射:配置文件
{
受保护的覆盖无效配置()
{
CreateMap().formMember(x=>x.Value,opt=>opt.ResolveUsing());
}
类值解析程序:IValueResolver
{
私人供应商(供应商);;
公共价值分解器(IValueSupplier valueSupplier)
{
_valueSupplier=valueSupplier;
}
公共解决结果解决(解决结果源)
{
sourcesrc=(Source)Source.Value;
返回源.New(_valueSupplier.Value*src.MyValue);
}
}
}
这种方法迫使我为每个需要DI的属性创建一个解析器类

我可能遗漏了一些东西,但我似乎找不到任何方法在AutoMapper中键入Lambda表达式映射,使用DI提供程序提供接口的实现

所以我想要这样的东西:

protected override void Configure()
    {
        CreateMap<Source, Destination>().ForMember(x => x.Value, opt => opt.MapFrom(src => opt.GetInstance<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));
        }
    }
}
受保护的覆盖无效配置()
{
CreateMap().formMember(x=>x.Value,opt=>opt.MapFrom(src=>opt.GetInstance().Value*src.MyValue));
}

所以……我设法创建了一个扩展方法,它提供了以下语法:

protected override void Configure()
    {
        CreateMap<Source, Destination>().ForMember(x => x.Value, opt => opt.MapFrom(src => opt.Service().OfType<IValueSupplier>().Value * src.MyValue));
    }
受保护的覆盖无效配置()
{
CreateMap().formMember(x=>x.Value,opt=>opt.MapFrom(src=>opt.Service().OfType().Value*src.MyValue));
}
扩展方法如下所示:

protected override void Configure()
    {
        CreateMap<Source, Destination>().ForMember(x => x.Value, opt => opt.MapFrom(src => opt.GetInstance<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));
        }
    }
}
公共静态类扩展
{
公共静态ServiceProvider服务(此IMemberConfiguration表达式映射器)
{
var field=mapper.GetType().GetField(“_serviceCtor”,BindingFlags.Instance | BindingFlags.NonPublic);
Func kernelFunc=field.GetValue(映射器)作为Func;
返回新的服务提供者(kernelFunc);
}
公共类服务提供者
{
私有函数;
公共服务提供者(Func内核函数)
{
_kernelFunc=kernelFunc;
}
类型()的公共T
{
return(T)u kernelFunc.Invoke(typeof(T));
}
}
}

但这很糟糕,对吧?有谁能告诉我我错过了什么,或者AutoMapper只是需要一些DI语法改进吗?

因此……我设法创建了一个扩展方法,它为我提供了以下语法:

protected override void Configure()
    {
        CreateMap<Source, Destination>().ForMember(x => x.Value, opt => opt.MapFrom(src => opt.Service().OfType<IValueSupplier>().Value * src.MyValue));
    }
受保护的覆盖无效配置()
{
CreateMap().formMember(x=>x.Value,opt=>opt.MapFrom(src=>opt.Service().OfType().Value*src.MyValue));
}
扩展方法如下所示:

protected override void Configure()
    {
        CreateMap<Source, Destination>().ForMember(x => x.Value, opt => opt.MapFrom(src => opt.GetInstance<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));
        }
    }
}
公共静态类扩展
{
公共静态ServiceProvider服务(此IMemberConfiguration表达式映射器)
{
var field=mapper.GetType().GetField(“_serviceCtor”,BindingFlags.Instance | BindingFlags.NonPublic);
Func kernelFunc=field.GetValue(映射器)作为Func;
返回新的服务提供者(kernelFunc);
}
公共类服务提供者
{
私有函数;
公共服务提供者(Func内核函数)
{
_kernelFunc=kernelFunc;
}
类型()的公共T
{
return(T)u kernelFunc.Invoke(typeof(T));
}
}
}
但这很糟糕,对吧?谁能告诉我我错过了什么,或者AutoMapper只是需要一些DI语法改进