Если я правильно понимаю, консоль в вашем решении действует как псевдо HangFire, поскольку, как вы сказали, она выполняет некоторые операции с базой данных сверхурочно, и вы планируете выполнять ее с помощью планировщика заданий.
Обзор HangFire
HangFire был разработан, чтобы делать с вашим консольным приложением именно то, что вы хотите, но с гораздо большей мощностью и функциональностью, поэтому вы избегаете всех накладных расходов, связанных с созданием всего этого самостоятельно.
Установка HangFire
HangFire обычно устанавливается вместе с приложениями ASP.NET, но если вы внимательно прочитаете документацию, то с удивлением обнаружите следующее:
Проект Hangfire состоит из нескольких пакетов NuGet, доступных на сайте галереи NuGet. Вот список основных пакетов, о которых вы должны знать:
Hangfire – пакет загрузчика, предназначенный для установки только для приложений ASP.NET, использующих SQL. Сервер как хранилище заданий. Он просто ссылается на пакеты Hangfire.Core, Hangfire.SqlServer и Microsoft.Owin.Host.SystemWeb.
Hangfire.Core — базовый пакет, содержащий все основные компоненты Зависание. Его можно использовать в любом типе проекта, включая приложение ASP.NET, службу Windows, консоль, любое веб-приложение, совместимое с OWIN, рабочую роль Azure и т. д.
Как видите, HangFire можно использовать в проектах любого типа, включая консольные приложения, но вам потребуется управлять всеми библиотеками и добавлять их в зависимости от того, какое хранилище заданий вы будете использовать. Подробнее здесь:
После установки HangFire вы можете настроить его для использования панели инструментов, которая представляет собой интерфейс, где вы можете найти всю информацию о ваших фоновых заданиях. В компании, в которой я работаю, мы использовали HangFire несколько раз с повторяющимися заданиями, в основном для импорта пользователей, синхронизации информации между приложениями и выполнения операций, выполнение которых было бы дорогостоящим в рабочее время, и панель мониторинга оказалась очень полезной, когда мы хотели узнать, выполнялась определенная работа или нет. Он также использует CRON для планирования операций.
Пример того, что мы используем прямо сейчас:
Startup.cs
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
//Get the connection string of the HangFire database
GlobalConfiguration.Configuration.UseSqlServerStorage(connection);
//Start HangFire Server and enable the Dashboard
app.UseHangfireDashboard();
app.UseHangfireServer();
//Start HangFire Recurring Jobs
HangfireServices.Instance.StartSendDetails();
HangfireServices.Instance.StartDeleteDetails();
}
}
HangfireServices.cs
public class HangfireServices
{
//.. dependency injection and other definitions
//ID of the Recurring JOBS
public static string SEND_SERVICE = "Send";
public static string DELETE_SERVICE = "Delete";
public void StartSend()
{
RecurringJob.AddOrUpdate(SEND_SERVICE, () =>
Business.Send(), //this is my class that does the actual process
HangFireConfiguration.Instance.SendCron.Record); //this is a simple class that reads an configuration CRON file
}
public void StartDeleteDetails()
{
RecurringJob.AddOrUpdate(DELETE_SERVICE, () =>
Business.SendDelete(), //this is my class that does the actual process
HangFireConfiguration.Instance.DeleteCron.Record); //this is a simple class that reads an configuration CRON file
}
}
HangFireConfiguration.cs
public sealed class HangFireConfiguration : ConfigurationSection
{
private static HangFireConfiguration _instance;
public static HangFireConfiguration Instance
{
get { return _instance ?? (_instance = (HangFireConfiguration)WebConfigurationManager.GetSection("hangfire")); }
}
[ConfigurationProperty("send_cron", IsRequired = true)]
public CronElements SendCron
{
get { return (CronElements)base["send_cron"]; }
set { base["send_cron"] = value; }
}
[ConfigurationProperty("delete_cron", IsRequired = true)]
public CronElements DeleteCron
{
get { return (CronElements)base["delete_cron"]; }
set { base["delete_cron"] = value; }
}
}
hangfire.config
<hangfire>
<send_cron record="0,15,30,45 * * * *"></send_cron>
<delete_cron record="0,15,30,45 * * * *"></delete_cron>
</hangfire>
Приведенное выше выражение CRON будет выполняться 0,15,30,45 минут каждый час каждый день.
Web.config
<configSections>
<!-- Points to the HangFireConfiguration class -->
<section name="hangfire" type="MyProject.Configuration.HangFireConfiguration" />
</configSections>
<!-- Points to the .config file -->
<hangfire configSource="Configs\hangfire.config" />
Заключение
Учитывая сценарий, который вы описали, я бы, вероятно, установил HangFire в ваше приложение ASP.NET MVC и удалил консольное приложение, просто потому, что это на один проект меньше, о чем нужно беспокоиться. Несмотря на то, что вы можете установить его в консольное приложение, я бы предпочел не следовать этому пути, потому что, если вы наткнетесь на кирпичную стену (а вы наткнетесь, поверьте мне), скорее всего, вы найдете помощь в основном для случаев, когда он был установлен в приложениях ASP.NET.
person
jpgrassi
schedule
06.01.2016