Dependency injection Autofac范围界定问题

Dependency injection Autofac范围界定问题,dependency-injection,asp.net-web-api,autofac,fluentvalidation,Dependency Injection,Asp.net Web Api,Autofac,Fluentvalidation,我正在尝试使用FluentValidation设置自定义模型验证程序提供程序。在我尝试将业务层管理器注入验证器的构造函数以运行某些业务逻辑之前,一切都正常 public class Repository : IRepository { public Repository(IDbConnection) { } } public class Manager : IManager { public Manager(IRepository) { } }

我正在尝试使用FluentValidation设置自定义模型验证程序提供程序。在我尝试将业务层管理器注入验证器的构造函数以运行某些业务逻辑之前,一切都正常

public class Repository : IRepository
{
    public Repository(IDbConnection)
    {
    }
}

public class Manager : IManager
{
    public Manager(IRepository)
    {
    }
}

public AutofacValidatorFactory : ValidatorFactoryBase
{
}

public MyModelValidator : AbstractValidator<MyModel>
{
    public MyModelValidator(IManager) { }
}
当我的验证器工厂尝试启动验证器实例时,问题就出现了。此时我得到以下异常:

“从请求实例的作用域中看不到标记与'AutofacWebRequest'匹配的作用域。这通常表示SingleInstance()组件正在请求根据HTTP请求注册的组件(或类似情况)。”在web集成下,始终从DependencyResolver.Current或ILifetimeScopeProvider.RequestLifetime请求依赖项,而不是从容器本身。”

我认为这个问题与Autofac中配置Manager&Repository的方式有关,但我不知道我遗漏了什么


编辑:此问题发生在Web API项目中。

如果没有看到更多的代码,我无法回答您的直接问题,但是我可以回答此异常的一般含义

Autofac支持嵌套的生存期范围(即子容器)。主容器实际上只是根生命周期范围。每个生命周期范围都可以看作是一个工作单元。创建生存期范围,解析执行该任务所需的实例,然后处置生存期范围。然后,由生存期范围创建的任何内容都将被释放

注册为SingleInstance意味着单个实例由根作用域解析和存储。使用InstancePerLifetimeScope将根据解析的每个作用域重新创建每个实例,因此最终可以在根作用域和子作用域中创建一个实例。InstancePerMatchingLifetimeScope允许您注册类型,以便在树的特定分支的所有子容器之间共享该类型。这些类型永远不能存在,也不能被根范围中的任何对象访问。InstancePerAppRequest与InstancePerMatchingLifetimeScope(“AutofacWebRequest”)相同

在您的应用程序中,每个请求都是一个子autofac作用域。注册到子作用域的内容(即您的IDBConnection)可以使用同一作用域中的任何其他内容(注册为InstancePerLifetimeScope)和父作用域中的任何内容(注册为SingleInstance),但是这里有一个潜在的问题。注册到父作用域的内容(例如根容器中的SingleInstance)无法访问子作用域中注册为InstancePerMatchingLifetimeScope的内容,因为父作用域无权访问子作用域中的实例


这是您最有可能完成的操作–将某个对象注册为单个实例,该实例依赖于注册到匹配生存期范围的对象。

如何解析验证器?你能发布你的验证器工厂实现吗?
builder.Register(c => new SqlConnection(ConfigurationManager.ConnectionStrings["MyCS"].ConnectionString))
               .As<IDbConnection>().InstancePerApiRequest();

builder.RegisterType<Repository>()
               .As<IRepository>()
               .InstancePerDependency();

builder.RegisterType<Manager>()
               .As<IManager>()
               .InstancePerDependency();

builder.RegisterType<ValidatorFactory>()
               .As<IValidatorFactory>()
               .InstancePerLifetimeScope();

        builder.RegisterType<FluentValidation.Mvc.WebApi.FluentValidationModelValidatorProvider>()
               .As<ModelValidatorProvider>()
               .InstancePerLifetimeScope();

        AssemblyScanner.FindValidatorsInAssembly(assembly)
                       .ForEach(
                           result =>
                           Builder.RegisterType(result.ValidatorType).As(result.InterfaceType).InstancePerApiRequest());
// _validatorProvider is injected as per Autofac config above.    
GlobalConfiguration.Configuration.Services.Add(typeof(ModelValidatorProvider), _validatorProvider);