gpt4 book ai didi

c# - Autofac + Automapper + 自定义 ValueResolver

转载 作者:太空宇宙 更新时间:2023-11-03 10:45:19 26 4
gpt4 key购买 nike

假设我有自定义 ValueResolver

public class AssessmentAttendiesResolver : ValueResolver<List<int>, ICollection<Expert>>
{
private readonly IRepository<Expert> _expertRepository;

public AssessmentAttendiesResolver(IRepository<Expert> expertRepository)
{
_expertRepository = expertRepository;
}

protected override ICollection<Expert> ResolveCore(List<int> source)
{
return (ICollection<Expert>)_expertRepository.Query();
}
}

在我的 Global.asax 中,我注册了我的自定义解析器并像这样覆盖 Mapper.Initialize 方法。

builder.RegisterAssemblyTypes(currentAssembly).AsClosedTypesOf(typeof(ValueResolver<,>)).AsSelf();

var container = builder.Build();
Mapper.Initialize(conf => conf.ConstructServicesUsing(container.Resolve));

CreateMap方法

    Mapper.CreateMap<AssessmentCreateRequestModel, Assessment>()
.ForMember(dest => dest.Attendies, opt => opt.ResolveUsing<AssessmentAttendiesResolver>().FromMember(item => item.Attendies));

当我运行代码时出现异常

No scope with a Tag matching 'AutofacWebRequest' is visible from the scope in which the instance was requested. This generally indicates that a component registered as per-HTTP request is being requested by a SingleInstance() component (or a similar scenario.) Under the web integration always request dependencies from the DependencyResolver.Current or ILifetimeScopeProvider.RequestLifetime, never from the container itself.

为了将我的存储库成功注入(inject)我的自定义值解析器,我应该更改什么?

最佳答案

您正在将 container.Resolve 传递给您的 Mapper.Initialize 调用,这意味着您的所有服务都将在容器的生命周期范围内解析。但错误消息表明它正在尝试解析某些已注册 InstancePerHttpRequest 的服务。

您需要更改相关注册,以便它们不在 http 请求范围内,或者将您传递给 Mapper.Initialize 的 lamba 更改为它从当前生命周期解析范围。

我不知道 Automapper 何时解析服务以及它保留这些服务多长时间才能告诉您哪种解决方案更好。理想情况下...IF Automapper 仅在需要它们时解析服务,然后立即忘记它们,那么我建议使用我的第二个解决方案,否则您将被迫使用第一个解决方案.

关于c# - Autofac + Automapper + 自定义 ValueResolver,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23675641/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com