92 lines
3.1 KiB
C#

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