我正在尝试使用带有依赖注入的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));
}
答案 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语法改进?