using gehGassiApp.Core.Data; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; using gehGassiApp.Core.Interfaces; namespace gehGassiApp.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 /// Gibt an ob NoTRacking verwendet werden soll. Es werden keine Entitäten im EF-Speicher gehalten /// Entität oder null, wenn nicht gefunden public abstract T Get(object id, bool noTracking = true); /// /// Gibt eine Entität anhand der eindeutigen Id zurück /// /// Id der Entität /// Gibt an ob NoTRacking verwendet werden soll. Es werden keine Entitäten im EF-Speicher gehalten /// Entität oder null, wenn nicht gefunden public abstract Task GetAsync(object id, bool noTracking = true); /// /// Gibt alle Entitäten zurück /// /// Gibt an ob NoTRacking verwendet werden soll. Es werden keine Entitäten im EF-Speicher gehalten /// Liste aller Entitäten public virtual IEnumerable GetAll(bool noTracking = true) { return Repository.GetAll(noTracking); } /// /// Gibt alle Entitäten zurück /// /// Gibt an ob NoTRacking verwendet werden soll. Es werden keine Entitäten im EF-Speicher gehalten /// Liste aller Entitäten public virtual async Task> GetAllAsync(bool noTracking = true) { return await Repository.GetAllAsync(noTracking).ConfigureAwait(false); } /// /// Gibt eine Liste aller Entitäten zurück welche definierten Kriterien entsprechen /// /// Kriterien /// Gibt an ob NoTRacking verwendet werden soll. Es werden keine Entitäten im EF-Speicher gehalten /// Liste gefundener Entitäten public virtual IEnumerable Find(Expression> predicate, bool noTracking = true) { if (predicate == null) throw new ArgumentNullException(nameof(predicate)); return Repository.Find(predicate, noTracking); } /// /// Gibt eine Liste aller Entitäten zurück welche definierten Kriterien entsprechen /// /// Kriterien /// Gibt an ob NoTRacking verwendet werden soll. Es werden keine Entitäten im EF-Speicher gehalten /// Liste gefundener Entitäten public virtual async Task> FindAsync(Expression> predicate, bool noTracking = true) { if (predicate == null) throw new ArgumentNullException(nameof(predicate)); return await Repository.FindAsync(predicate, noTracking).ConfigureAwait(false); } /// /// Gibt eine Liste aller Entitäten zurück welche definierten Kriterien entsprechen /// /// Kriterien /// Gibt an ob NoTRacking verwendet werden soll. Es werden keine Entitäten im EF-Speicher gehalten /// Liste gefundener Entitäten public IQueryable Query(Expression> predicate, bool noTracking = true) { if (predicate == null) throw new ArgumentNullException(nameof(predicate)); return Repository.Query(predicate, noTracking); } /// /// Gibt eine Entität oder den Default wert zurück /// /// Kriterien /// Gibt an ob NoTRacking verwendet werden soll. Es werden keine Entitäten im EF-Speicher gehalten /// Gefundene entität oder Default-Wert public virtual T SingleOrDefault(Expression> predicate, bool noTracking = true) { if (predicate == null) throw new ArgumentNullException(nameof(predicate)); return Repository.SingleOrDefault(predicate, noTracking); } /// /// Gibt eine Entität oder den Default wert zurück /// /// Kriterien /// Gibt an ob NoTRacking verwendet werden soll. Es werden keine Entitäten im EF-Speicher gehalten /// Gefundene entität oder Default-Wert public virtual async Task SingleOrDefaultAsync(Expression> predicate, bool noTracking = true) { if (predicate == null) throw new ArgumentNullException(nameof(predicate)); return await Repository.SingleOrDefaultAsync(predicate, noTracking).ConfigureAwait(false); } #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().ConfigureAwait(false); } #endregion #region Commit / UnitOfWork /// /// Schließt Daten-Änderungen ab und speichert die selben /// public int Commit() { return _unitOfWork.Commit(); } /// /// Schließt Daten-Änderungen ab und speichert die selben /// public async Task CommitAsync() { return await _unitOfWork.CommitAsync().ConfigureAwait(false); } #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 } }