【问题标题】:ASP.NET Boilerplate & Windows serviceASP.NET 样板和 Windows 服务
【发布时间】:2017-09-29 14:32:04
【问题描述】:

我正在创建一个基于 ABP 的简单 ASP.NET 解决方案,作为该解决方案的一部分,我使用了一个标准的 Windows 服务,该服务应该执行小型后台操作(目前只有 ICMP ping,但后来可能更多)。

是否可以在此 Windows 服务中使用 ABP 应用程序服务(最好使用 IoC)?

感谢您的任何建议。

【问题讨论】:

    标签: c# asp.net asp.net-boilerplate


    【解决方案1】:

    当然,您可以在 Windows 服务项目中使用您的 AppServices。您还可以在 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:当我在头顶写代码时,它可能会抛出错误,但基本上这应该可以指导你。

    【讨论】:

    • 谢谢。尽管它不是开箱即用的(正如您警告我的那样),但它是一个至关重要的指导,最终帮助我解决了这个问题。谢谢。
    • @MartinSlezák 如果上述方法没有按您的预期工作,您能否提供有效的解决方案?谢谢!
    • 根据我的阅读,我认为在最新版本的 ABP 中上述内容已更改为 var bootstrapper = AbpBootstrapper.Create<MySampleProjectApplicationModule>(); 然后 bootstrapper.Initialize(); 是这样吗?当我尝试此操作时,我收到以下错误消息:无法创建组件“Abp.BackgroundJobs.BackgroundJobStore”,因为它需要满足依赖项。 'Abp.BackgroundJobs.BackgroundJobStore' 正在等待以下依赖项: - 服务'Abp.Domain.Repositories.IRepository`2 有什么想法吗?你能用正确的方式更新你的答案吗?
    • @LeonardoSpina 是的,我能够让它工作。最后,该代码与 Migrator 实用程序中包含的代码非常相似。看看那个,如果你不能让某些东西起作用,我会尝试把一个样本放在一起。
    • @GaryEwanPark 谢谢!但实际上我仍然得到这个: Castle.MicroKernel.Handlers.HandlerException: 'Can't create component 'Abp.BackgroundJobs.BackgroundJobStore' 因为它需要满足依赖关系。 'Abp.BackgroundJobs.BackgroundJobStore' 正在等待以下依赖项: - 服务 'Abp.Domain.Repositories.IRepository`2[[Abp.BackgroundJobs.BackgroundJobInfo, Abp, Version=3.2.4.0, Culture=neutral, PublicKeyToken=null] ,[System.Int64, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]' 未注册。 '
    猜你喜欢
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多