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
}
}