我有一个名为 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中,而不是传播逻辑。
答案 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所需的任何依赖项都将被解析,并作为执行上下文与任务一起排队。