Запустите пользовательский модуль как службу вместо запуска приложения WinForms - PullRequest
1 голос
/ 03 мая 2019

Я создал пользовательский модуль для Kofax.Этот модуль является приложением WinForms с формой выполнения и формой установки (модуль администрирования).

Для приложения времени выполнения я использую этот код


Program.cs - запустить форму выполнения

internal static class Program
{
    [STAThread]
    private static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new FrmMain());
    }
}

FrmMain.cs - инициализировать пользовательский интерфейс и создать необходимые экземпляры

public partial class FrmMain : Form
{
    private BatchProcessor batchProcessor;
    private BatchManager batchManager;
    private SessionManager sessionManager;

    public FrmMain()
    {
        InitializeComponent();
    }

    private void FrmMain_Load(object sender, EventArgs e)
    {
        try
        {
            batchProcessor = new BatchProcessor();
            sessionManager = new SessionManager();
            batchManager = new BatchManager(batchProcessor, sessionManager);
            // UpdateUI();              
            timerBatchPolling.Enabled = true;
        }
        catch (Exception exception)
        {
            throw exception;
        }
    }

    private void FrmMain_FormClosed(object sender, FormClosedEventArgs e)
    {
        timerBatchPolling.Enabled = false;

        try
        {
            sessionManager.Logout();
        }
        catch (Exception exception)
        {
            throw exception;
        }
    }

    private void timerBatchPolling_Tick(object sender, EventArgs e)
    {
        timerBatchPolling.Enabled = false;
        batchManager.BatchPolling();
        // UpdateUI();
        timerBatchPolling.Enabled = true;
    }
}

BatchManager.cs - запросить следующую партию для обработки

internal class BatchManager
{
    private BatchProcessor batchProcessor;
    private SessionManager sessionManager;

    public IBatch CurrentActiveBatch { get; private set; }

    public BatchManager(BatchProcessor batchProcessor, SessionManager sessionManager)
    {
        this.batchProcessor = batchProcessor;
        this.sessionManager = sessionManager;
        this.sessionManager.LoginToRuntimeSession();
    }

    public void BatchPolling()
    {
        CurrentActiveBatch = sessionManager.GetNextBatch();

        if (CurrentActiveBatch != null)
        {
            batchProcessor.ProcessBatch(CurrentActiveBatch);
        }
        else
        {
            sessionManager.Logout();
        }
    }
}

BatchProcessor.cs - обработать партию

internal class BatchProcessor
{
    public void ProcessBatch(IBatch batch)
    {
        // ...
    }
}

Iтолько что увидел, что также можно запускать пользовательские модули как сервисы.Я не знаю, как их зарегистрировать или как настроить код, поэтому я спрашиваю, есть ли способ изменить мой код, чтобы превратить модуль в службу вместо приложения форм.

Спасибо запомощь!

1 Ответ

1 голос
/ 06 мая 2019

Создать новый класс, производный от ServiceBase . Двумя соответствующими методами являются OnStart и OnStop, подробнее о них здесь . Вот один пример, обратите внимание, что CustomModule - это один из моих пользовательских классов, который заботится о входе в KC, обработке пакетов и т. Д.

protected override void OnStart(string[] args)
{
    // TODO: Add code here to start your service.
    cm = new CustomModule();
    cm.Login("", "");

    if (CustomModule.BatchNotificationEnabled == true)
    {
        cm.ListenForNewBatches();
    }
    else
    {
        cm.PollForNewBatches();
    }
}

Для установки службы вы можете добавить еще один класс, производный от Installer , но это не является обязательным. Тем не менее, я бы порекомендовал пройти лишнюю милю, поскольку это позволит вам установить и удалить CM в том же стиле, что и все модули Kofax: MyCustomModule.exe -install.

Наконец, в вашем Program.cs проверьте, запустил ли пользователь модуль в интерактивном режиме или нет:

if (Environment.UserInteractive)
{
    // run as module
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new RuntimeForm(args));
}
else
{
    // run as service
    ServiceBase.Run(new CustomModuleService());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...