La mia applicazione ASP.NET WebAPI ha un livello Data & Service, più progetti in un'unica soluzione.
Data Layer (Entity Framework)
-DbContext.cs
Service Layer (Business Logic)
-Controller.cs
-Global.asax
Una delle mie entità richiede l'intercettazione della logica aziendale ogni volta che esegue DbContext SaveChanges ().
public class MyDbContext : DbContext
{
public override int SaveChanges()
{
BusinessLogicAndUpdateEntity(); //Code from Service Layer
return base.SaveChanges();
}
}
Attualmente la logica aziendale risiede nel livello di servizio, e il progetto di dati non può fare riferimento al progetto del livello di servizio altrimenti il progetto sarà circolare facendo riferimento l'un l'altro.
C'è un modo per me di sovrascrivere DbContext SaveChanges () nel livello di servizio senza spostare la logica di business sul livello dati?
Puoi attivare un evento in MyDbContext (forse esiste già in DbContext?)
public delegate void BeforeSaveChangesSignature ();
public class MyDbContext : DbContext
{
public event BeforeSaveChangesSignature BeforeSaveChanges {get; set;}
public override int SaveChanges()
{
BeforeSaveChanges?.Invoke();
return base.SaveChanges();
}
}
La tua logica aziendale quindi sottoscriverebbe l'evento e eseguirà tutto ciò di cui ha bisogno:
...
var context = new MyDbContext();
context.BeforeSaveChanges += () => { Console.WriteLine("Before save"); }
...