如何在控制器之外使用单元工作

时间:2017-05-29 12:44:37

标签: c# dependency-injection autofac unit-of-work

所以,我老实说甚至不确定如何提出这个问题,因为我缺乏这方面的经验。如果缺少信息,请告诉我,我将添加所有信息。

我基本上尝试使用过滤器在我的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();
}

2 个答案:

答案 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。