Webapi环境中的Sharprepository Autofac InstancePerapRequest不工作

Webapi环境中的Sharprepository Autofac InstancePerapRequest不工作,autofac,sharp-repository,Autofac,Sharp Repository,是否有人使用InstancePerapireRequest for DbContext将sharprepository与autofac集成的工作示例 我正在注册我的dbcontext: builder.RegisterType<AuditTestEntities>().As<DbContext>().InstancePerApiRequest(); builder.RegisterType(); 如果删除InstancePerapRequest,sharpreposi

是否有人使用InstancePerapireRequest for DbContext将sharprepository与autofac集成的工作示例

我正在注册我的dbcontext:

builder.RegisterType<AuditTestEntities>().As<DbContext>().InstancePerApiRequest();
builder.RegisterType();
如果删除InstancePerapRequest,sharprepository就能够获得dbcontext。但是对于InstancePerapRequest,我得到了粘贴在下面的错误消息。基本上,我怀疑错误的症结在于sharprepository调用的方式:

从请求实例的作用域中看不到标记与“AutofacWebRequest”匹配的作用域。这通常表示根据HTTP请求注册的组件正被web集成下的SingleInstance()组件(或类似场景)请求。始终从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.RepositoryDependencyResolvexException:无法使用“AutofacDependencyResolver”解析类型“System.Data.Entity.DbContext”。确保已为此类型配置Ioc容器。有关详细信息,请查看InnerException。-->Autofac.Core.DependencyResolutionException:从请求实例的作用域中看不到标记与“AutofacWebRequest”匹配的作用域。这通常表示根据HTTP请求注册的组件正被web集成下的SingleInstance()组件(或类似场景)请求。始终从DependencyResolver.Current或ILifetimeScopeProvider.RequestLifetime请求依赖项,而不是从容器本身


好的,我发现了问题。当使用MVC或Web API集成并尝试使用作用域InstancePerApiRequest或InstancePerHttpRequest时,使用SharpRepository AutofacDependencyResolver会出现问题。Autofac希望这些项目从System.Web.DependencyResolver.Current解析,而不是像Autofac DependencyResolver当前所做的那样直接从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);
    }
}
**更新** 我使用MVC进行了测试,能够复制错误并修复它,但这不适用于Web API。我习惯于在使用GlobalConfiguration.Configuration.DependencyResolver时使用StructureMap

问题似乎在于Autofac需要一个IDependencyScope,您可以从HttpRequestMessage访问它,但我没有看到在ApicController之外实现这一点的方法。这说明了问题和原因:


不幸的是,现在我对处理这件事的最佳方法有点不知所措。但是我会继续考虑的。

好的,我发现了问题。当使用MVC或Web API集成并尝试使用作用域InstancePerApiRequest或InstancePerHttpRequest时,使用SharpRepository AutofacDependencyResolver会出现问题。Autofac希望这些项目从System.Web.DependencyResolver.Current解析,而不是像Autofac DependencyResolver当前所做的那样直接从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);
    }
}
**更新** 我使用MVC进行了测试,能够复制错误并修复它,但这不适用于Web API。我习惯于在使用GlobalConfiguration.Configuration.DependencyResolver时使用StructureMap

问题似乎在于Autofac需要一个IDependencyScope,您可以从HttpRequestMessage访问它,但我没有看到在ApicController之外实现这一点的方法。这说明了问题和原因:


不幸的是,现在我对处理这件事的最佳方法有点不知所措。但是我会继续考虑的。

因此,我能够通过将生存期范围更改为
InstancePerLifetimeScope
使我的工作正常。我不知道这是否有任何不可预见的后果。到目前为止,我似乎一切正常。

因此,我可以通过将生存期范围更改为
InstancePerLifetimeScope
使我的工作正常。我不知道这是否有任何不可预见的后果。到目前为止,一切似乎都很顺利。

只有几个问题需要澄清。1) AccountRepository是如何定义的?它是使用ConfigurationBasedRepository还是从特定类型的存储库(如Ef5Repository)继承?2) 是否通过调用RepositoryDependencyResolver.SetDependencyResolver()来设置SharpRepository依赖项解析位?3) 您是否正在使用Ioc.AutoFac软件包提供的builder.RegisterSharpRepository()?它使用的是ConfigurationBasedRepository。我在启动时完成了builder.RegisterSharpRepository()调用,并安装了RepositoryDependencyResolver.SetDependencyResolver(新的SharpR