Neuen Provider erstellen
Provider-Library
Für einen neuen Provider wird ein Projekt vom Typ Classlibrary gemäss elego Projektstruktur erstellt und das Nuget Package Eis.Framework.Business.Base aus dem Eis.azure.feed hinzugefügt.
Namenskonvention
Wichtig: Der Namespace muss zwingend mit Eis. ... beginnen. Sonst werden eingebettete Ressourcen und die Bausteine nicht berücksichtigt.
Nun wird das Provider-Interface und eine konkrete Implementierung erstellt.
using Eis.Framework.Business.Core;
namespace Eis.MyDemo.Service.Demo
{
public interface IDemoProvider : IProvider
{
}
}
using Eis.Framework.Business.Base.Provider;
namespace Eis.MyDemo.Service.Demo
{
internal class DemoProvider : ProviderBase, IDemoProvider
{
protected override void InitializeImpl(IDictionary<string, string> parameters)
{
base.InitializeImpl(parameters);
}
}
}
Provider integrieren
Der Provider muss dem Service als Projektreferenz hinzugefügt werden.
Provider mit Parameter
Ein Eintrag in Tabelle PROVIDER_CONFIG bindet eine konkrete Provider-Implementierung an ein Provider-Interface. In Tabelle PROVIDER_CONFIG_PARAM können für jeden Provider beliebig viele Parameter defniert werden. Diese werden normalerweise (Release) per TFS-Variable zugewiesen. Für die Entwicklung (Debug) werden die Werte direkt zugewiesen.
Für das Binding eines Provider und die Definition eines Parameters sind drei SQL-Files gemäss folgender Struktur mit Build Action Embedded resource zu erstellen:

Pcg_g_id
Als ID wird eine neue GUID gelöst und als PK resp. FK verwendet.
Insert_[Providername].sql:
INSERT INTO [env].[PROVIDER_CONFIG]
([PCG_G_ID],
[PCG_N_VERSION],
[PCG_D_INSERTED_ON],
[PCG_S_INSERTED_BY],
[PCG_D_UPDATED_ON],
[PCG_S_UPDATED_BY],
[PCG_D_CREATED_ON],
[PCG_S_CREATED_BY],
[PCG_D_MODIFIED_ON],
[PCG_S_MODIFIED_BY],
[PCG_D_DELETED_ON],
[PCG_S_DELETED_BY],
[PCG_S_KEY],
[PCG_S_INTERFACE_TYPE],
[PCG_S_CLASS_TYPE])
VALUES (N'87CD07E4-841B-4D02-B69D-A6712EA5689D'
, 1
, CURRENT_TIMESTAMP
, N'SYSTEM'
, CURRENT_TIMESTAMP
, N'SYSTEM'
, CURRENT_TIMESTAMP
, N'SYSTEM'
, CURRENT_TIMESTAMP
, N'SYSTEM'
, NULL
, N''
, N'DemoProvider'
, N'Eis.MyDemo.Service.Demo.IDemoProvider, Eis.MyDemo.Service.Demo'
, N'Eis.MyDemo.Service.Demo.DemoProvider, Eis.MyDemo.Service.Demo');
GO
Insert_[Providername]_DEBUG.sql:
INSERT INTO [env].[PROVIDER_CONFIG_PARAM]
([PCP_G_ID],
[PCP_N_VERSION],
[PCP_D_INSERTED_ON],
[PCP_S_INSERTED_BY],
[PCP_D_UPDATED_ON],
[PCP_S_UPDATED_BY],
[PCP_D_CREATED_ON],
[PCP_S_CREATED_BY],
[PCP_D_MODIFIED_ON],
[PCP_S_MODIFIED_BY],
[PCP_D_DELETED_ON],
[PCP_S_DELETED_BY],
[PCP_G_PROVIDER_CONFIG_ID],
[PCP_S_KEY],
[PCP_S_VALUE])
VALUES (NEWID()
, 1
, CURRENT_TIMESTAMP
, N'SYSTEM'
, CURRENT_TIMESTAMP
, N'SYSTEM'
, CURRENT_TIMESTAMP
, N'SYSTEM'
, CURRENT_TIMESTAMP
, N'SYSTEM'
, NULL
, N''
, N'A87CD07E4-841B-4D02-B69D-A6712EA5689D'
, N'MyConfig'
, N'MyConfigValue');
GO
Insert_[Providername]_RELEASE.sql:
INSERT INTO [env].[PROVIDER_CONFIG_PARAM]
([PCP_G_ID],
[PCP_N_VERSION],
[PCP_D_INSERTED_ON],
[PCP_S_INSERTED_BY],
[PCP_D_UPDATED_ON],
[PCP_S_UPDATED_BY],
[PCP_D_CREATED_ON],
[PCP_S_CREATED_BY],
[PCP_D_MODIFIED_ON],
[PCP_S_MODIFIED_BY],
[PCP_D_DELETED_ON],
[PCP_S_DELETED_BY],
[PCP_G_PROVIDER_CONFIG_ID],
[PCP_S_KEY],
[PCP_S_VALUE])
VALUES (NEWID()
, 1
, CURRENT_TIMESTAMP
, N'SYSTEM'
, CURRENT_TIMESTAMP
, N'SYSTEM'
, CURRENT_TIMESTAMP
, N'SYSTEM'
, CURRENT_TIMESTAMP
, N'SYSTEM'
, NULL
, N''
, N'A87CD07E4-841B-4D02-B69D-A6712EA5689D'
, N'MyConfig'
, N'__MyConfig__');
GO
Provider ohne Parameter
Sind keine Parameter erforderlich und gibt es nur genau eine Implementierung, kann anstelle der SQL-Files die Zuweisung per Attributierung in der Provider-Klasse gemacht werden.
[SystemProviderMetadata<IDemoProvider>]
internal class DemoProvider : ProviderBase, MyDemo.Service.Demo.IDemoProvider
{
}
Raum in Betrieb
Optional kann ein Raum definiert werden:
internal class DemoProvider : ProviderBase, MyDemo.Service.Demo.IDemoProvider
{
protected override void InitializeImpl(IDictionary<string, string> parameters)
{
base.InitializeImpl(parameters);
RegisterDynamicModule(new DynamicModuleConfigurator<MyDemoModule>()
.ConfigureModule(RoomTypes.Operation, -1)
.RegisterActivityCommand<TestActivity>()
.Module);
}
[Module(nameof(RoomTypes.Operation), De = "MyDemo D", Fr = "MyDemo F", It = "MyDemo I", En = "MyDemo E")]
[Command(nameof(RoomTypes.Operation), nameof(TestActivity), De = "Interne Abrechnung")]
private class MyDemoModule : DynamicModule
{
}
}