Autofac + Automapper +自定义ValueResolver

时间:2014-05-15 10:29:15

标签: c# asp.net-mvc automapper autofac

我们说我有自定义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));

当我运行代码时,我得到了这样的异常

  

没有标记匹配的范围&#39; AutofacWebRequest&#39;从请求实例的范围中可见。这通常表示SingleInstance()组件(或类似场景)正在请求注册为每HTTP请求的组件。在Web集成下,始终从DependencyResolver.Current或ILifetimeScopeProvider.RequestLifetime请求依赖项,从不从容器本身请求

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

1 个答案:

答案 0 :(得分:2)

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

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

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