[英]Automapper - Value Resolver with generics problem
我在我們的ASP網絡核心應用程序中使用了Automapper。 對於類型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();
注冊了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.