【问题标题】:How to use unitofwork outside of Controllers如何在控制器之外使用 unitofwork
【发布时间】:2017-05-29 12:44:36
【问题描述】:

所以,老实说,我什至不知道如何提出这个问题,因为我缺乏这方面的经验。如果缺少信息,请告诉我,我会补充所有信息。

我基本上是在尝试通过使用过滤器在我的 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 未被用户代码处理
'Autofac.Core.DependencyResolutionException' 类型的异常 发生在 Autofac.dll 中,但未在用户代码中处理

附加信息:没有标签匹配的范围 'AutofacWebRequest' 在实例所在的范围内可见 被要求。这通常表明一个组件注册为 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();
}

【问题讨论】:

  • 我会重新审视你的 IUnitOfWork 接口......当然它不应该知道所有的存储库,而是你会有一个服务,它会知道存储库和工作单元,并使用它们来执行一个工作单元。在您当前的设计中,每次添加新存储库时都必须更改您的界面。这肯定是不正确的
  • 如果您使用的是实体框架(或 LINQ),则数据上下文已经是工作单元模式的实现,因此您也不需要在更高级别重新执行此操作

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


【解决方案1】:

附加信息是你的朋友:

从请求实例的范围内看不到范围 [...]。这通常表明注册为 per-HTTP 请求的组件正在被 SingleInstance() 组件(或类似场景)请求。

ExceptionFilter 是一个 SingleInstance 组件,因为它对应用程序中的所有请求都是通用的(单一实例),而不是让特定实例绑定到特定请求。

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

【讨论】:

  • 你正在处理一个Captive Dependency
  • Generic ExceptionFilter 可能依赖于不应是单个实例的日志记录服务。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-15
    • 2011-08-19
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    相关资源
    最近更新 更多