C# 如何在控制器外使用unitofwork

C# 如何在控制器外使用unitofwork,c#,dependency-injection,autofac,unit-of-work,C#,Dependency Injection,Autofac,Unit Of Work,所以,老实说,我甚至不知道该怎么问这个问题,因为我在这个话题上缺乏经验。如果有信息丢失,请告诉我,我将添加所有信息 我基本上是想通过使用过滤器在我的web应用程序中添加一个异常处理系统 下面你可以看到我创建的过滤器。在这里,我试图到达我的unitofwork,但我一直在container.Resolve()上遇到异常行 public class LogExceptionFilterAttribute : ExceptionFilterAttribute { public override

所以,老实说,我甚至不知道该怎么问这个问题,因为我在这个话题上缺乏经验。如果有信息丢失,请告诉我,我将添加所有信息

我基本上是想通过使用过滤器在我的web应用程序中添加一个异常处理系统

下面你可以看到我创建的过滤器。在这里,我试图到达我的unitofwork,但我一直在
container.Resolve()上遇到异常

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>();
    }
}
其他信息在这里是您的朋友:

从请求实例的作用域中看不到任何作用域[…]。这通常表示SingleInstance()组件(或类似场景)正在请求按照HTTP请求注册的组件

ExceptionFilter是单实例组件,因为它是应用程序中所有请求的通用(单实例),而不是将特定实例绑定到特定请求

实际上,他们在Autofac网站上有一个相当不错的Web API,可以归结为实现IautoFaceExceptionFilter和使用属性注入来解决FilterAttribute中的问题。 还有一个问题,可以归结为调用RegisterFilterProvider来启用过滤器的属性注入。

这里是您的朋友:

从请求实例的作用域中看不到任何作用域[…]。这通常表示SingleInstance()组件(或类似场景)正在请求按照HTTP请求注册的组件

ExceptionFilter是单实例组件,因为它是应用程序中所有请求的通用(单实例),而不是将特定实例绑定到特定请求

实际上,他们在Autofac网站上有一个相当不错的Web API,可以归结为实现IautoFaceExceptionFilter和使用属性注入来解决FilterAttribute中的问题。 还有一个,可以归结为调用RegisterFilterProvider来启用过滤器的属性注入。

1)是否正在运行测试,其中AutoFacPerRequestScope尚未初始化? 您可能必须使用PerLifeTimeScope生存期而不是PerRequest生存期。

1)是否正在运行测试,其中AutoFacPerRequestScope尚未初始化?
您可能必须使用PerLifeTimeScope lifetime而不是PerRequest lifetime。

我将重新访问您的IUnitOfWork界面。。。。当然,它不应该知道所有的存储库,而是应该有一个服务,它将知道存储库和工作单元,并使用它们来执行工作单元。在当前设计中,每次添加新存储库时都必须更改界面。如果您使用的是实体框架(或LINQ),那么这肯定是不正确的。数据上下文已经是工作单元模式的一个实现,因此您不需要在更高级别上重新执行此操作,我将重新访问您的IUnitOfWork接口。。。。当然,它不应该知道所有的存储库,而是应该有一个服务,它将知道存储库和工作单元,并使用它们来执行工作单元。在当前设计中,每次添加新存储库时都必须更改界面。如果您使用的是实体框架(或LINQ),那么这肯定是不正确的。数据上下文已经是工作单元模式的实现,因此,您不需要在更高级别上重新执行此操作。您正在处理。泛型ExceptionFilter可能依赖于不应为单个实例的日志记录服务。您正在处理。泛型ExceptionFilter可能依赖于不应为单个实例的日志记录服务。
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();
}