Шаблон ASP.NET и служба Windows

Я создаю простое решение ASP.NET, основанное на ABP, и как часть этого решения я использую стандартную службу Windows, которая должна выполнять небольшие фоновые операции (пока только ICMP ping, но позже, вероятно, больше).

Можно ли использовать службы приложений ABP внутри этой службы Windows (в идеале с использованием IoC)?

Спасибо за любое предложение.


person Martin Slezák    schedule 29.09.2017    source источник


Ответы (1)


Конечно, вы можете использовать свои AppServices в проекте службы Windows. Также вы можете писать фоновые задания в службе Windows. Вам необходимо сослаться на проект вашего приложения из службы Windows. Поскольку каждый проект ведет себя как модуль. Ваша новая служба Windows должна быть зарегистрирована как модуль. так что вы можете использовать службы зависимостей и другие полезные библиотеки ABP.

Я покажу вам несколько примеров кода о модуляции. Но я рекомендую вам прочитать документ модуля: https://aspnetboilerplate.com/Pages/Documents/Module-System

MyWindowsServiceManagementModule.cs

 [DependsOn(typeof(MySampleProjectApplicationModule))]
    public class MyWindowsServiceManagementModule : AbpModule
    {
        public override void Initialize()
        {
            IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());

        }

    }

MyWindowsServiceWinService.cs

public partial class MyWindowsServiceWinService : ServiceBase
    {
        private MyWindowsServiceManagementBootstrapper _bootstrapper;

        public MyWindowsServiceWinService()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            try
            {
                _bootstrapper = new MyWindowsServiceManagementBootstrapper();
                _bootstrapper.Initialize();
            }

            catch (Exception ex)
            {
                //EventLog.WriteEntry("MyWindowsService can not be started. Exception message = " + ex.GetType().Name + ": " + ex.Message + " | " + ex.StackTrace, EventLogEntryType.Error);               
            }
        }

        protected override void OnStop()
        {
            try
            {
                _bootstrapper.Dispose();
            }           
            catch (Exception ex)
            {
                //log...
            }           
        }
    }

MyWindowsServiceManagementBootstrapper.cs

    public class MyWindowsServiceManagementBootstrapper : AbpBootstrapper
        {

            public override void Initialize()
            {
                base.Initialize(); 
            }

            public override void Dispose()
            {
                //release your resources...
                base.Dispose();
            }
        }

Ps: Поскольку я писал коды наверху моей головы, это могло вызвать ошибки, но в основном это должно вас направить.

person Alper Ebicoglu    schedule 30.09.2017
comment
Спасибо. Хотя это не сработало из коробки (как вы меня предупреждали), это было важное руководство, которое в конце концов помогло мне решить проблему. Спасибо. - person Martin Slezák; 02.10.2017
comment
@ MartinSlezák, если бы вышеперечисленное не сработало так, как вы ожидали, смогли бы вы предоставить свое решение, которое действительно сработало? Спасибо! - person Gary Ewan Park; 13.03.2018
comment
Основываясь на моем чтении, я думаю, что в последней версии ABP приведенное выше было изменено на что-то вроде var bootstrapper = AbpBootstrapper.Create<MySampleProjectApplicationModule>();, а затем bootstrapper.Initialize();. Это правильно? Когда я пытаюсь это сделать, я получаю следующее сообщение об ошибке: Не удается создать компонент Abp.BackgroundJobs.BackgroundJobStore, поскольку у него есть зависимости, которые необходимо удовлетворить. 'Abp.BackgroundJobs.BackgroundJobStore' ожидает следующих зависимостей: - Служба 'Abp.Domain.Repositories.IRepository`2 Есть идеи? Не могли бы вы правильно обновить свой ответ? - person Gary Ewan Park; 13.03.2018
comment
@LeonardoSpina да, мне удалось заставить это работать. В итоге код был очень похож на тот, что включен в утилиту Migrator. Взгляните на это, и если у вас не получится заставить что-то работать, я постараюсь собрать образец. - person Gary Ewan Park; 01.05.2018
comment
@GaryEwanPark Спасибо! Но на самом деле я все еще получаю это: Castle.MicroKernel.Handlers.HandlerException: «Невозможно создать компонент Abp.BackgroundJobs.BackgroundJobStore», поскольку у него есть зависимости, которые необходимо удовлетворить. 'Abp.BackgroundJobs.BackgroundJobStore' ожидает следующих зависимостей: - Служба 'Abp.Domain.Repositories.IRepository`2 [[Abp.BackgroundJobs.BackgroundJobInfo, Abp, Version = 3.2.4.0, Culture = нейтральный, PublicKeyToken = null] , [System.Int64, System.Private.CoreLib, Version = 4.0.0.0, Culture = нейтральный, PublicKeyToken = 7cec85d7bea7798e]] », который не был зарегистрирован. ' - person Leonardo Spina; 02.05.2018
comment
Если у меня будет возможность, я попытаюсь создать небольшой пример приложения, которое покажет, как делать то, что требуется. Хотя я, скорее всего, не смогу посмотреть на это на этой неделе. - person Gary Ewan Park; 03.05.2018
comment
@GaryEwanPark, это было бы здорово. Спасибо, Гэри. С нетерпением жду вашего примера - person Leonardo Spina; 03.05.2018
comment
@LeonardoSpina Это отличные новости! Возможно, разместите здесь еще один ответ с вашим решением? - person Gary Ewan Park; 05.05.2018