using System; using System.Collections.Generic; using System.Threading.Tasks; using gehGassi.Core.Interfaces; using Microsoft.EntityFrameworkCore; namespace gehGassi.Persistence { /// /// Service welcher Operationen in einem Repository gruppiert und bestätigt (speichert). /// Weiters werden die einzelnen Repositories nur über diesen Service abgerufen /// public class UnitOfWork : IUnitOfWork { private bool _disposed = false; private readonly IServiceProvider _serviceProvider; private readonly IAuditDbContext _context; private readonly Dictionary _repositories = new Dictionary(); /// /// Erstellt eine Instanz /// /// /// Datenbank-Kontext /// Instanz eines AuditService public UnitOfWork(IServiceProvider serviceProvider, IAuditDbContext context) { _serviceProvider = serviceProvider; _context = context; } /// /// Gibt ein Repository im Kontext der UnitOfWork zurück /// /// Typ (Klasse) /// IRepository oder null, wenn nicht verfügbar public IRepository GetRepository() where T : class { if (!_repositories.ContainsKey(typeof(T))) { _repositories.Add(typeof(T), new Repository(_context as DbContext)); } return (IRepository)_repositories[typeof(T)]; } /// /// Schließt Daten-Änderungen ab und speichert die selben /// /// Name des Benutzers /// Gibt an, dass kein Audit-Eintrag erstellt werden soll, auch wenn Audit aktiviert ist public int Commit(string userName, bool noAudit) { return _context.SaveChanges(userName, noAudit); } /// /// Schließt Daten-Änderungen ab und speichert die selben /// /// Name des Benutzers /// Gibt an, dass kein Audit-Eintrag erstellt werden soll, auch wenn Audit aktiviert ist public async Task CommitAsync(string userName, bool noAudit) { return await _context.SaveChangesAsync(userName, noAudit); } /// /// Dispose /// /// protected virtual void Dispose(bool disposing) { if (!this._disposed) { if (disposing) { _context.Dispose(); } } this._disposed = true; } /// /// Dispose /// public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } } }