Table of Contents

Desenvolvendo Plugins

O servidor do JJIntegration suporta tarefas customizadas com suporte a diversas ações.

  1. Adicione um arquivo NuGet.config com o seguinte conteúdo na raiz de sua solution.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
   <add key="GitLabJJ" value="https://gitlab.jjconsulting.com.br/api/v4/groups/30/-/packages/nuget/index.json" />
   <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
</packageSources>
<packageSourceCredentials>
    <GitLabJJ>
       <add key="Username" value="jjconsulting" />
       <add key="ClearTextPassword" value="gldt-HgKek3e_hXgnbhnFygag" />
   </GitLabJJ>
</packageSourceCredentials>
</configuration>
  1. Crie um projeto class library .NET 8, o seu .csproj deve ser semelhante ao abaixo. Se atente as tags EnableDynamicLoading e na referência dos PluginContracts as tags Private e ExcludeAssets
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
	<PlatformTarget>AnyCPU</PlatformTarget>
	<EnableDynamicLoading>true</EnableDynamicLoading>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="JJIntegration.PluginContracts" Version="1.0.0" >
        <Private>false</Private>
        <ExcludeAssets>runtime</ExcludeAssets>
    </PackageReference>

    <!-- Adicione aqui mais referências -->
  </ItemGroup>
</Project>
  1. Na sua class library, crie uma classe que implemente a interface IScheduleTask, no exemplo abaixo, essa é a tarefa com as ações do projeto do Farol de Pedidos.
using BOPE.Services;
using JJIntegration.PluginContracts;
using System.Security.Cryptography;
using System.Text;
using Microsoft.Extensions.DependencyInjection;

namespace BOPE.JJIntegration;

public class BopeScheduleTask : IScheduleTask
{
    private const string SalesOrder = "0";
    private const string Delivery = "1";
    private const string Invoice = "2";
    public string TaskName => "Farol de Pedidos";

    public IEnumerable<ScheduleAction> Actions
    {
        get
        {
            yield return new(SalesOrder, "SalesOrder");
            yield return new(Delivery, "Delivery");
            yield return new(Invoice, "Invoice");
        }
    }

    public Guid TaskId => Guid.Parse("GERE_SEU_GUID_AQUI_E_COLE_AQUI");

    private IServiceProvider ServiceProvider { get; }
    
    public BopeScheduleTask()
    {
        var services = new ServiceCollection();

        services.AddBopeServices();

        ServiceProvider = services.BuildServiceProvider();
    }

    public async Task<ScheduleResult> ExecuteAction(string actionId, IScheduleLogger logger, CancellationToken cancellationToken)
    {
        var scheduleReturn = new ScheduleResult();

        string taskName = Actions.GetName(actionId);
        try
        {
            var loggerWrapper = new JJIntegrationLoggerWrapper(logger);
            
            ServiceBase? service = null;

            service = actionId switch
            {
                Delivery => ServiceProvider.GetRequiredService<DeliveryService>(),
                Invoice => ServiceProvider.GetRequiredService<InvoiceService>(),
                SalesOrder => ServiceProvider.GetRequiredService<SalesOrderService>(),
                _ => service
            };
            
            await service!.Process(loggerWrapper, cancellationToken);

            scheduleReturn.Message += $"{taskName}\r\n{service.GetDetailMessage()}\r\n";

            if (!scheduleReturn.HasError)
                scheduleReturn.HasError = service.NumberOfErrors > 0;
        }
        catch (Exception ex)
        {
            logger.LogError(ex.ToString());
            scheduleReturn.Message = ex.ToString();
            scheduleReturn.HasError = true;
        }

        return scheduleReturn;
    }

}

Tip

Para utilizar injeção de dependência, note que criamos uma ServiceCollection somente para esse plugin. Essa classe vai ser registrada como Singleton no servidor. Recupere serviços do tipo Transient no método ExecuteAction e crie instâncias Singleton no construtor.

  1. Publique o plugin em modo Release e adicione ele a pasta Plugins de seu servidor. Você pode colocar vários plugins em vários subdiretórios.