所以,我老实说甚至不确定如何提出这个问题,因为我缺乏这方面的经验。如果缺少信息,请告诉我,我将添加所有信息。
我基本上尝试使用过滤器在我的Web应用程序中添加异常处理系统。
下面你可以看到我创建的过滤器。在这里,我试图达到我的单位工作,但我不断在container.Resolve<IUnitOfWork>();
行上获得例外。
public class LogExceptionFilterAttribute : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext context)
{
var dependencyResolver = GlobalConfiguration.Configuration.DependencyResolver
as AutofacWebApiDependencyResolver;
var container = dependencyResolver.Container;
var uow = container.Resolve<IUnitOfWork>();
}
}
我得到的例外:
用户代码未处理DependencyResolutionException
类型&#39; Autofac.Core.DependencyResolutionException&#39; 发生在Autofac.dll但未在用户代码中处理附加信息:没有标记匹配的范围 &#39; AutofacWebRequest&#39;从实例的范围可见 被要求了。这通常表示注册为的组件 SingleInstance()组件正在请求每HTTP请求 (或类似场景。)在Web集成下始终请求 来自DependencyResolver.Current或的依赖项 ILifetimeScopeProvider.RequestLifetime,永远不会从容器中 本身。
这是IUnitOfWork界面:
public interface IUnitOfWork : IDisposable
{
IBoothRepository BoothRepository { get; }
IEventRepository EventRepository { get; }
ILocationRepository LocationRepository { get; }
IPersonRepository PersonRepository { get; }
IProfessionalRepository ProfessionalRepository { get; }
IRegistrationRepository RegistrationRepository { get; }
IStakeholderRepository StakeholderRepository { get; }
IStudentRepository StudentRepository { get; }
IVisitRepository VisitRepository { get; }
void SaveChanges();
DbContextTransaction BeginTransaction();
}
答案 0 :(得分:2)
其他信息是您的朋友:
从请求实例的范围中看不到范围[...]。这通常表示SingleInstance()组件(或类似方案)正在请求注册为每HTTP请求的组件。
ExceptionFilter是一个SingleInstance组件,因为它是应用程序中所有请求的通用(单实例),而不是将特定实例绑定到特定请求。
他们在Autofac网站上的Web API实际上有一个相当不错的HowTo,它实现了IAutofacExceptionFilter并使用Property Injection来解决你在FilterAttribute中解决的问题。 还有一个MVC HowTo,它归结为调用RegisterFilterProvider为过滤器启用Property Injection。
答案 1 :(得分:0)
1)您是否正在运行测试,而AutoFacPerRequestScope尚未初始化? 您可能必须使用PerLifeTimeScope生命周期而不是PerRequest Lifetime。