Skip to content

Neues Custom-Repository erstellen

Soll eine Entität nicht auf der Datenbank persistiert werden, sondern über einen Webservice oder von einem File, etc. bezogen werden, kann ein eigenes Repository erstellt werden.

Folgendes Beispiel zeigt eine Beispiel-Implementierung für die Methoder GetById. Die weiteren in IWriteRepository definierten Methoden sind analog zu implementieren.

using CSharpFunctionalExtensions;
using Eis.Framework.Business.Base.Provider.Repository;
using Eis.Framework.Business.Core;
using Eis.Framework.Utilities.FunctionalExtensions;

namespace Eis.MyDemo.Service.Demo;

[EisRepository<CustomEntityRepository, ICustomEntity>]
internal class CustomEntityRepository : IWriteRepository<ICustomEntity>
{
    public Result<ICustomEntity, IError> GetById(string entityId)
    {
        Maybe<ICustomEntity> entity = new CustomEntity(entityId);
        return entity.ToResult(NotFoundError.Create("Entity with Id {entityId} not found.", entityId));
    }

    ...

    private class CustomEntity : EntityBase<ICustomEntity>, ICustomEntity
    {
        public CustomEntity(string id)
        {
            Id = id;
        }

        public string Test => $"Test-{Id}";
    }
}

Kompatibilität

Damit das CustomRepository auch für die generischen Zugriffe wie z.B. EisEnvironmentInstance.GetById() funktioniert, muss in der InitializeImpl-Methode des der Entität zugewiesenen Providers (Attributierung im Entity-Interface) ein LeagacyRepositoryWrapper registriert werden.

Folgende generische Funktionalität wird aktuell noch nicht unterstützt:

  • GetAll
  • GetByIds
  • GetAllByPublicId
  • GetByPropertyValueOrNull

Folgende generische Funktionalität wird mit dem neuen Repository nicht mehr unterstützt und muss entitätsspezifisch gelöst werden:

  • CreateFromDict
  • CreateFromValueObject
  • GetDefaultDataAsValueObject

Der LeagacyRepositoryWrapper wird wie folgt registriert.

using Eis.Framework.Business.Core;

namespace Eis.MyDemo.Service.Demo;

public interface ICustomProvider : IProvider
{
}

[SystemProviderMetadata<ICustomProvider>]
internal sealed class CustomProvider : ProviderBase,  ICustomProvider
{
    protected override void InitializeImpl(IDictionary<string, string> parameters)
    {
        RegisterRepository(new LeagacyRepositoryWrapper<ICustomEntity>());
    }
}

Das neue Repository kann nun per Dependency-Injection (IReadRepository resp. IWriteRepository) in allen Bausteinen gemäss folgendem Beispiel verwendet werden:

using Eis.Framework.Business.Base.Activity;
using Eis.Framework.Business.Base.Extension;
using Eis.Framework.Business.Base.Provider.Repository;

namespace Eis.MyDemo.Service.Demo.Extension;

public class LoadCustomEntityActivity : CodeActivityStandalone
{
    private readonly IReadRepository<ICustomEntity> _readRepository;

    public TestCustomEntityActivity(IReadRepository<ICustomEntity> readRepository)
    {
        _readRepository = readRepository;
    }

    public InputParameter<string> Id { get; } = new();

    public OutputParameter<ICustomEntity> DemoEntity { get; } = new();

    protected override void Execute(ActivityContext activityContext)
    {
        var id = Id.GetValue(activityContext);
        var entity = _readRepository.GetById(id).Value;
        DemoEntity.SetValue(entity, activityContext);
    }
}