Webapi环境中的Sharprepository Autofac InstancePerapRequest不工作
是否有人使用InstancePerapireRequest for DbContext将sharprepository与autofac集成的工作示例 我正在注册我的dbcontext: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
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