Desenvolvendo Plugins
O servidor do JJIntegration suporta tarefas customizadas com suporte a diversas ações.
- 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>
- 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 tagsPrivate
eExcludeAssets
<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>
- 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.
- 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.