【问题标题】:Detect context in Self-hosted Web Api在自托管 Web Api 中检测上下文
【发布时间】:2014-11-19 14:24:57
【问题描述】:

在我当前的项目中,我有一个定期运行任务的 Windows 服务 (TopShelf/Quartz.net)。我不想为 Web 服务创建单独的项目,而是想使用 OWIN 中提供的自托管功能将其添加到 Windows 服务中。这还有一个额外的好处,就是不需要在 IIS 中部署。

当我要实现我的数据访问层 (DAL) 时,我会遇到问题。

我所有的数据库操作都是在一个存储在请求状态的 UnitOfWork 中完成的,最后有一个提交/回滚。上下文决定了 UnitOfWork 的生命周期(请求状态)。在控制台应用程序中,我将使用 PerThreadRequest 状态。在网络环境中,我有一个 PerHttpRequestState。这意味着 UnitOfWork 的范围是每个线程或每个 HttpRequest。

然而,在我当前的项目中,我混合了控制台(Quartz 作业)和 Web(Web api 调用)。它们都需要使用 DAL,但不能使用与另一个上下文相同的请求状态。

我可以手动解决这个问题。当使用来自石英作业的 DAL 时,让它使用 PerThreadRequestState,当使用来自 web api 调用的 DAL 时,使用 PerHttpRequestState 但这是一个混乱的解决方案。 使用 DAL 时,它应该检测到它正在运行的上下文并做出相应的反应。

但是我该如何检测上下文呢?

【问题讨论】:

    标签: c# nhibernate asp.net-web-api owin quartz.net


    【解决方案1】:

    我会建议这样的事情,使用 Castle Windsor(虽然原理与其他 IOC/DI 框架相同)

    if(HttpRuntime.AppDomainAppId != null) //it's a web app
    {
        container.Register(
             Component.For<IUnitOfWork>().ImplementedBy<PerHttpRequestState>());
    }
    else //it's a windows app
    {
        container.Register(
             Component.For<IUnitOfWork>().ImplementedBy<PerThreadRequestState>());
    }
    

    话虽如此,在线程生活方式上使用 UoW 有一些注意事项:

    • 首先,您必须确保您的 UoW 是线程安全的(如果两个或更多作业最终同时访问 UoW,会发生什么情况?)
    • 更重要的是,Quartz.NET 内部使用了一个 ThreadPool,因此它不一定会在每次启动作业时创建一个新线程,而是重用一个现有的线程。这会导致泄漏;您的 UoW 实际上可以在工作之间共享。您可能想要的是使用自定义 PerQuartzJob 生活方式。

    但是,这两者都取决于您打算将石英服务用于何种用途。如果您没有很多长期运行的、可能重叠的 CRUD 作业,那么它们就不是问题了。

    【讨论】:

    • 我的 UoW 是线程安全的,因为使用了 [ThreadStatic] 标签。不过,您关于 ThreadPool 中潜在泄漏的观点是正确的。我没有想到这一点。该池包含 10 个线程,每个线程都有一个 ThreadStatic 状态。由同一线程运行的连续作业可能会访问相同的状态。然而,在 Job 的范围内,UoW 被 using(){} 包围,因此应该在下一个作业在同一线程上运行时释放它。
    • 您的建议是在容器中注册正确的 UoW 实现,但我需要两者。 WebApi 在服务中自托管,因此对 webapi 的调用是按 http 请求进行的。在同一个服务中运行的 Quartz 作业应该是 PerThread(或 PerQuartzJob)。我不应该将这两者混合在同一个服务中吗?或者我需要一种方法来动态识别 UoW 的使用情况。在 webapi 方法和石英作业执行中,HttpRuntime.AppDomainAppId 属性为 null。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 2017-03-26
    • 1970-01-01
    • 2023-01-07
    • 2014-09-18
    相关资源
    最近更新 更多