【问题标题】:Hangfire in separate Class Library .dll that is called from ASP.Net MVC5Hangfire 在从 ASP.Net MVC5 调用的单独类库 .dll 中
【发布时间】:2016-10-27 20:43:47
【问题描述】:

我有一个名为 AppCore 的类库 DLL,它存储所有与数据库相关的访问并包含所有应用程序逻辑。

此库由 ASP.Net (MVC5) 应用程序使用,该应用程序将该库用于所有 DB 访问(通过公开的方法)和特定于应用程序的逻辑(实体框架或 DBContext 未公开在 DLL 之外)。

AppCore 有一些方法可能需要几分钟才能运行。这些方法需要从 ASP.Net 应用程序中调用。

我想我们都知道 ASP.Net 中长时间运行的调用都是:“不,不要这样做,这会很糟糕,你以后会因为这样做而诅咒”。

因此,我正在研究由 Scott Hanselman 等人推荐的 Hangfire.io,用于长时间运行 ASP.Net 调用。

现在我的问题是,是否有人知道如何在类库 DLL 中实现 Hangfire,而该类库 DLL 又会被 ASP.Net 应用程序使用。 AppCore.dll 中包含 DbContext,并且它具有长时间运行的方法。但是调用将来自 ASP.Net,它对数据库或长期运行的代码逻辑没有直接的了解。

编辑:我能想到的最好方法是在 ASP.Net 应用程序中安装 Hangfire,并为此设置一个单独的 DBContext。但是,我更愿意将它全部放在 AppCore DLL 中,而不是散布逻辑。

【问题讨论】:

  • 您似乎走在了正确的轨道上。Hangfire 非常适合从 ASP.net 脱机任务。但是,我不确定我是否理解您担心的原因。您声明 appcore.dll 拥有它自己的依赖项,例如 dbcontext 等,但是您建议在 ASP.net 代码中创建一个 dbcontext。这是因为您需要在某处注入 dbcontext 吗?
  • 好吧,我假设 Hangfire 需要我在 ASP.Net 站点的 Startup.Configuration 中运行东西(如操作指南中所述)。但由于 ASP.Net 不了解数据库,这变得很棘手。目前正在考虑为 Hangfire 创建一个单独的前端数据库,而不是“污染”核心数据库。
  • 如果我只是在单独的 DLL 中使用 hangfire,并且在 ASP.Net 站点的启动中什么都不做,它仍然是持久的吗?'
  • 看我的回答 - 我认为你误解了hangfire的工作原理......

标签: c# asp.net hangfire


【解决方案1】:

我的问题是,如果有人知道如何在 一个类库 dll 将依次被 ASP.Net 使用 应用

您不需要在代码中实现hangfire,它最终将由hangfire 执行

Hangfire 将在 ASP.net 的进程内运行,并将使用后期绑定持久地执行指定的代码。

正在执行的代码完全不知道是谁在执行它,也不在乎。

在您的情况下,这意味着您通常会调用 appcore.dll 的位置,只需将其替换为调用 hangfire 以排队然后执行任务。

假设您的 appcore.dll 公开了以下操作:

interface IDoSomethingBig
{
    void DoSomethingBig();
}

您可以通过以下方式告诉hangfire 执行此操作:

BackgroundJob.Enqueue<IDoSomethingBig>(x => x.DoSomethingBig());  

appcore.dll 具有的任何需要满足的依赖项都将被解析并作为执行上下文与任务一起排队。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    相关资源
    最近更新 更多