Automapper-具有泛型问题的值解析程序



我正在将Automapper与我们的asp-net核心应用程序一起使用。对于类型A->BA->C的映射,我需要一个外部服务来注入一些额外的数据。因此,我写了一个ValueResolver<T>,其中TBC。由于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,它就会自动解析具有IMyService依赖关系的MyValueResolver

当我不使用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>。但是该方法不接受定义了泛型的类型(我认为这是C#的限制?),比如cfg.ConstructServicesUsing(MyValueResolver<C> => new MyValueResolver<C>(service));

有没有解决办法,或者我可以使用不同的模式?

我使用ConstructServicesUsing的方式完全错误。

它采用一个函数,其中Type-是我要解析的ValueResolver的类型,Object是已解析的实例。对于不想解析的类型,应该返回null

所以它看起来是这样的:

cfg => cfg.ConstructServicesUsing(type => type == typeof(MyValueResolver<B>) ? new MyValueResolver<B>(service) : null));

这个答案要归功于@LucianBargaoanu。

最新更新