簡體   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