Windows服务和设计模式

时间:2014-01-13 04:01:27

标签: design-patterns windows-services

我有一个Windows服务来执行后台进程。这个Windows服务将与asp.net网站互动。功能如下。

在我的网站上有3个动作。用户可以选择任务(假设有三个按钮)。然后它将调用Windows服务。其余操作由Windows服务执行。用户可以从网站注销,但它将在后台运行该服务。一旦完成,它将在数据库中进行相应的更改。 我需要知道是否可以将任何设计模式应用于Windows服务(工厂,抽象工厂等)。我已经阅读了不同的设计模式,但我对这如何应用于项目感到困惑。目前我在Windows服务的'OnStart'和'OnStop'事件中编写完整的代码。请指导我。

感谢。

1 个答案:

答案 0 :(得分:5)

我安装多个服务实例的唯一时间是针对多种环境,例如开发,测试和生产。否则,它应保留在同一服务中,假设所有代码在逻辑上相关。

至于设计模式,我一直在为我创建的大多数服务遵循一个简单的“模式”。我鼓励回答,因为我自己不知道这是一个好的模式。它主要涉及创建一个立即启动的主线程,以及基于需要完成的子线程。对于您的情况,下面可能是用户处理器的简单服务布局。

服务类:

public partial class Service : ServiceBase
{
    private Processor _processor;

    public Service() { InitializeComponent(); }

    protected override void OnStart(string[] args)
    {
        _processor = new Processor();
        new System.Threading.Thread(_processor.Run).Start();
    }

    protected override void OnStop()
    {
        _processor.Stop();
    }
}

处理器:

public class Processor
{        
    private bool _continue;
    private List<UserProcessor> _userProcessors; // List of users being processed.

    public void Run()
    {
        _continue = true;
        while (_continue)
        {
            var users = getUsersToProcess();
            foreach (User user in users)
            {
                if (_userProcessors.Any(u => u.UserId == user.UserId) == false)
                {
                    // Start a new processor for the user since it wasn't found.
                    var processor = new UserProcessor(user);
                    new System.Threading.Thread(processor.Run).Start();
                    _userProcessors.Add(processor);
                }
            }

            System.Threading.Thread.Sleep(1000);
        }
    }

    public void Stop()
    {
        _continue = false;

        foreach (var processer in _userProcessors)
            processer.Stop();
    }

    private List<User> getUsersToProcess() { throw new NotImplementedException(); }
}

当然,UserProcessor几乎与Processor相同,但在while循环中有不同的代码。这是你进行数据库交互的地方,但我会让你想出这部分。