繁体   English   中英

Automapper-具有通用问题的Value Resolver

[英]Automapper - Value Resolver with generics problem

我在我们的ASP网络核心应用程序中使用了Automapper。 对于类型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();注册了automapper。AddAutoMapper 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

它需要一个函数,其中ValueResolver要解析的ValueResolver的类型,而Object是已解析的实例。 对于您不想解析的类型,您应该返回null

因此,它看起来像这样:

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

感谢这个答案的@LucianBargaoanu。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM