Sto sviluppando un'applicazione SaaS multi-teant nel core mvc di ASP.NET e mi chiedevo quale sia l'approccio generale per applicare la logica del tenant in uno scenario di database condiviso (TenantId per ciascuna entità). E più specificamente, dove questa logica dovrebbe essere applicata; Nel contesto, UnitOfWork, repository o servizio?
La mia architettura attuale ha questo aspetto:
EF DbContext -> UnitOfWork -> Repository -> Service
In questo momento, sto applicando tutta la mia logica in EF DbContext. Ad esempio, applicare TenantId a un'entità:
public override int SaveChanges( )
{
foreach ( var entityEntry in ChangeTracker.Entries( ) )
{
if ( entityEntry.Entity is ITenantEntity entity )
{
if ( entityEntry.State == EntityState.Added ||
entityEntry.State == EntityState.Modified )
{
entity.TenantId = _tenantProvider.GetTenantId( );
}
}
}
return base.SaveChanges( );
}
E filtraggio dei dati in base al tenant:
protected override void OnModelCreating( ModelBuilder builder )
{
base.OnModelCreating( builder );
... omitted ....
builder.Entity<Person>( )
.HasQueryFilter( p => p.TenantId == _tenantProvider.GetTenantId( ) );
builder.Entity<Address>( )
.HasQueryFilter( p => p.TenantId == _tenantProvider.GetTenantId( ) );
builder.Entity<Company>( )
.HasQueryFilter( p => p.TenantId == _tenantProvider.GetTenantId( ) );
... omitted ....
}