我将Automapper与我们的ASP网络核心应用程序一起使用。对于类型A
-> B
和A
-> C
的映射,我需要外部服务来注入一些其他数据。因此,我写了ValueResolver<T>
,其中T
是B
或C
。由于C#没有类型的OR
运算符,因此我在这里使用通用的T
。
为清楚起见,我的价值解析器如下所示:
public class MyValueResolver<T>: IValueResolver<A, T, string>
{
private readonly IMyService _service;
public MyValueResolver(IMyService service)
{
_service = service;
}
public string Resolve(A source, T destination, string destMember, ResolutionContext context)
{
// do something using only source and _service.
return ...;
}
}
现在,在我的启动公司中,我注册了services.AddAutoMapper();
这样的自动映射器。因此,当我在应用程序中的任何地方使用它时,只需要将IMapper
注入构造函数中,它将自动解析具有MyValueResolver
依赖性的IMyService
。
当我不使用DI且同时需要MyValueResolver<B>
和MyValueResolver<C>
时,测试中就会出现问题。我尝试了以下方法:
var mappingConfig = new MapperConfiguration(cfg => {
cfg.AddProfile(new MappingProfile());
cfg.ConstructServicesUsing(MyValueResolver =>
new MyValueResolver<B>(service));
cfg.ConstructServicesUsing(MyValueResolver =>
new MyValueResolver<C>(service));
});
var mapper = new Mapper(mappingConfig);
但是这是行不通的,因为它会尝试在两种情况下都使用后一种语句,并且会失败,并出现错误,无法将MyValueResolver<C>
强制转换为MyValueResolver<B>
。但是该方法不接受这样定义cfg.ConstructServicesUsing(MyValueResolver<C> => new MyValueResolver<C>(service));
是否有任何解决方法,或者我可以使用其他模式?
答案 0 :(得分:1)
我完全错误地使用了ConstructServicesUsing
。
它具有一个函数,其中Type-是我要解析的ValueResolver
的类型,而Object
是已解析的实例。对于您不想解析的类型,您应该返回null
。
因此,它看起来像这样:
cfg => cfg.ConstructServicesUsing(type => type == typeof(MyValueResolver<B>) ? new MyValueResolver<B>(service) : null));
信贷请@LucianBargaoanu寻求答案。