1

有没有人有一个使用 InstancePerApiRequest for DbContext 与 autofac 进行Sharprepository 集成的工作示例?

我正在注册我的dbcontext:

builder.RegisterType<AuditTestEntities>().As<DbContext>().InstancePerApiRequest();

如果我删除 InstancePerApiRequest,sharprepository 就能够获得一个 dbcontext。但是使用 InstancePerApiRequest,我会收到下面粘贴的错误消息。基本上错误的症结在于,我怀疑,sharprepository 进行调用的方式:

从请求实例的范围中看不到带有与“AutofacWebRequest”匹配的标记的范围。这通常表明注册为 per-HTTP 请求的组件正在由 SingleInstance() 组件(或类似场景)请求。在 Web 集成下,始终从 DependencyResolver.Current 或 ILifetimeScopeProvider.RequestLifetime 请求依赖项,而不是从容器本身.

完整的错误堆栈:

iisexpress.exe 错误:0:Operation=DefaultHttpControllerActivator.Create,Exception=System.InvalidOperationException:尝试创建类型为“AccountController”的控制器时发生错误。确保控制器有一个无参数的公共构造函数。---> Autofac.Core.DependencyResolutionException:在“AccountRepository”类型上调用构造函数“Void .ctor()”时引发异常。---> 无法使用“AutofacDependencyResolver”解析类型“System.Data.Entity.DbContext”。确保您已为此类型配置了 Ioc 容器。查看 InnerException 以了解更多详细信息。(有关详细信息,请参阅内部异常。)---> SharpRepository.Repository.Ioc.RepositoryDe​​pendencyResolverException:无法解析类型“System.Data.Entity.DbContext” 使用“AutofacDependencyResolver”。确保您已为此类型配置了 Ioc 容器。查看 InnerException 以了解更多详细信息。---> Autofac.Core.DependencyResolutionException:从请求实例的范围内看不到标签匹配“AutofacWebRequest”的范围。这通常表明注册为 per-HTTP 请求的组件正在由 SingleInstance() 组件(或类似场景)请求。在 Web 集成下,始终从 DependencyResolver.Current 或 ILifetimeScopeProvider.RequestLifetime 请求依赖项,而不是从容器本身. 从请求实例的范围中看不到带有与“AutofacWebRequest”匹配的标记的范围。这通常表明注册为 per-HTTP 请求的组件正在由 SingleInstance() 组件(或类似场景)请求。在 Web 集成下,始终从 DependencyResolver.Current 或 ILifetimeScopeProvider.RequestLifetime 请求依赖项,而不是从容器本身. 从请求实例的范围中看不到带有与“AutofacWebRequest”匹配的标记的范围。这通常表明注册为 per-HTTP 请求的组件正在由 SingleInstance() 组件(或类似场景)请求。在 Web 集成下,始终从 DependencyResolver.Current 或 ILifetimeScopeProvider.RequestLifetime 请求依赖项,而不是从容器本身.

4

2 回答 2

1

好的,找到问题了。在使用 MVC 或 Web API 集成并尝试使用范围 InstancePerApiRequest 或 InstancePerHttpRequest 时,使用 SharpRepository AutofacDependencyResolver 会出现问题。Autofac 期望从 System.Web.DependencyResolver.Current 解决这些项目,而不是像 AutofacDependencyResolver 当前所做的那样直接从 Autofac IContainer 解决。

在我们为 AutofacDependencyResolver 进行重载以解决该问题之前,您可以立即解决此问题。

您将需要在您的项目中创建自己的依赖解析器,如下所示:

public class CustomAutofacDependencyResolver : BaseRepositoryDependencyResolver
{
    private readonly IDependencyResolver _resolver;

    public CustomAutofacDependencyResolver(IDependencyResolver resolver)
    {
        _resolver = resolver;
    }

    protected override T ResolveInstance<T>()
    {
        return _resolver.GetService<T>();
    }

    protected override object ResolveInstance(Type type)
    {
        return _resolver.GetService(type);
    }
}

然后向 SharpRepository 注册它,这样它将使用它来解析 DbContext,然后它将按预期工作。

RepositoryDependencyResolver.SetDependencyResolver(new CustomAutofacDependencyResolver(DependencyResolver.Current));

** 更新** 我正在使用 MVC 进行测试,并且能够复制错误并修复它,但这不适用于 Web API。我习惯于使用 StructureMap,它使用 GlobalConfiguration.Configuration.DependencyResolver 可以正常工作。

问题似乎是 Autofac 需要一个 IDependencyScope ,您可以从 HttpRequestMessage 访问它,但我没有看到在 ApiController 之外访问它的方法。这描述了问题和原因:https ://groups.google.com/forum/#!msg/autofac/b3HCmNE_S2M/oMmwFE5uD80J

不幸的是,现在我对处理这个问题的最佳方法有点不知所措。但我会继续思考。

于 2013-10-05T18:07:22.650 回答
0

因此,我能够通过将生命周期范围更改为InstancePerLifetimeScope. 我不知道这是否有任何不可预见的后果。到目前为止,一切似乎对我来说都很好。

于 2014-01-02T13:36:02.990 回答