using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Linq.Expressions; using System.Threading.Tasks; using gehGassi.Core.Interfaces; namespace gehGassi.Core.Services { /// /// Abstrakte Implementation des Service Interface als Basis für spezialisierte Klassen /// /// Typ der Klasse public abstract class ServiceBase : IDisposable, IService where T : class { private readonly IUnitOfWork _unitOfWork; private bool _disposed = false; internal readonly IRepository Repository; /// /// Erstellt eine Instanz /// /// Instanz eines IUnitOfWork protected ServiceBase(IUnitOfWork unitOfWork) { _unitOfWork = unitOfWork; Repository = _unitOfWork.GetRepository(); } #region Get /// /// Gibt eine Entität anhand der eindeutigen Id zurück /// /// Id der Entität /// Entität oder null, wenn nicht gefunden public virtual T Get(object id) { return id == null ? null : Repository.Get(id); } /// /// Gibt eine Entität anhand der eindeutigen Id zurück /// /// Id der Entität /// Entität oder null, wenn nicht gefunden public virtual async Task GetAsync(object id) { return id == null ? null : await Repository.GetAsync(id); } /// /// Gibt alle Entitäten zurück /// /// Liste aller Entitäten public virtual IEnumerable GetAll() { return Repository.GetAll(); } /// /// Gibt alle Entitäten zurück /// /// Liste aller Entitäten public virtual async Task> GetAllAsync() { return await Repository.GetAllAsync(); } /// /// Gibt eine Liste aller Entitäten zurück welche definierten Kriterien entsprechen /// /// Kriterien /// Liste gefundener Entitäten public virtual IEnumerable Find(Expression> predicate) { if (predicate == null) throw new ArgumentNullException(nameof(predicate)); return Repository.Find(predicate); } /// /// Gibt eine Liste aller Entitäten zurück welche definierten Kriterien entsprechen /// /// Kriterien /// Liste gefundener Entitäten public virtual async Task> FindAsync(Expression> predicate) { if (predicate == null) throw new ArgumentNullException(nameof(predicate)); return await Repository.FindAsync(predicate); } /// /// Gibt eine Liste aller Entitäten zurück welche definierten Kriterien entsprechen /// /// Kriterien /// Liste gefundener Entitäten public IQueryable Query(Expression> predicate) { if (predicate == null) throw new ArgumentNullException(nameof(predicate)); return Repository.Query(predicate); } /// /// Gibt eine Entität oder den Default wert zurück /// /// Kriterien /// Gefundene entität oder Default-Wert public virtual T SingleOrDefault(Expression> predicate) { if (predicate == null) throw new ArgumentNullException(nameof(predicate)); return Repository.SingleOrDefault(predicate); } /// /// Gibt eine Entität oder den Default wert zurück /// /// Kriterien /// Gefundene entität oder Default-Wert public virtual async Task SingleOrDefaultAsync(Expression> predicate) { if (predicate == null) throw new ArgumentNullException(nameof(predicate)); return await Repository.SingleOrDefaultAsync(predicate); } /// /// Gibt eine Entität oder den Default wert zurück /// /// Kriterien /// Gefundene entität oder Default-Wert public async Task FirstOrDefaultAsync(Expression> predicate) { if (predicate == null) throw new ArgumentNullException(nameof(predicate)); return await Repository.FirstOrDefaultAsync(predicate); } #endregion #region CRUD /// /// Fügt eine Entität zum Repository hinzu /// /// Entität public virtual void Add(T entity) { if (entity == null) throw new ArgumentNullException(nameof(entity)); Repository.Add(entity); } /// /// Fügt eine Liste von Entitäten zum Repository hinzu /// /// List von Entitäten public virtual void AddRange(IEnumerable entities) { if (entities == null) throw new ArgumentNullException(nameof(entities)); Repository.AddRange(entities); } /// /// Entfernt eine Entität aus dem Repository /// /// Zu entfernende Entität public virtual void Remove(T entity) { if (entity == null) throw new ArgumentNullException(nameof(entity)); Repository.Remove(entity); } /// /// Entfernt eine Liste von Entitäten aus dem Repository /// /// Liste von Entitäten public virtual void RemoveRange(IEnumerable entities) { if (entities == null) throw new ArgumentNullException(nameof(entities)); Repository.RemoveRange(entities); } #endregion #region Count /// /// Gibt die Anzahl aller Entitäten zurück /// /// Anzahl public virtual int Count() { return Repository.Count(); } /// /// Gibt die Anzahl aller Entitäten zurück /// /// Anzahl public virtual async Task CountAsync() { return await Repository.CountAsync(); } #endregion #region Commit / UnitOfWork /// /// Schließt Daten-Änderungen ab und speichert die selben /// /// Benutzername /// Gibt an, dass kein Audit-Eintrag erstellt werden soll, auch wenn Audit aktiviert ist [ExcludeFromCodeCoverage] public int Commit(string userName, bool noAudit = false) { return _unitOfWork.Commit(userName, noAudit); } /// /// Schließt Daten-Änderungen ab und speichert die selben /// /// Benutzername /// Gibt an, dass kein Audit-Eintrag erstellt werden soll, auch wenn Audit aktiviert ist [ExcludeFromCodeCoverage] public async Task CommitAsync(string userName, bool noAudit = false) { return await _unitOfWork.CommitAsync(userName, noAudit); } #endregion #region IDisposable /// /// Dispose /// /// protected virtual void Dispose(bool disposing) { if (!this._disposed) { if (disposing) { _unitOfWork.Dispose(); } } this._disposed = true; } /// /// Dispose /// public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } #endregion } }