从单独的类库.dll中挂起来自ASP.Net MVC5

时间:2016-09-08 07:49:12

标签: c# asp.net hangfire

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

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

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

我想我们都知道在ASP.Net中长时间运行的呼叫都是:“不,不要这样做,它会吮吸类型的东西,你会诅咒以后再做”。

因此,我正在调查Hangfire.io,这是其他Scott Hanselman推荐用于长期运行ASP.Net的调用。

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

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

1 个答案:

答案 0 :(得分:3)

  

我的问题是,如果有人知道如何实施Hangfire   一个类库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所需的任何依赖项都将被解析,并作为执行上下文与任务一起排队。