Dove applicare la logica multi-tenant (ASP.Net Core)?

0

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 ....
}
    
posta yuro.dvatov 15.12.2018 - 20:42
fonte

1 risposta

0

Fondamentalmente hai solo due opzioni

  1. Aggiungi tenantId agli oggetti radice e disponi solo di un repository universale

  2. Nascondi tenantId dal servizio avendo un repository per titolare

1 è molto più semplice, ma sembra che tu stia facendo 2.

La cosa fondamentale è capire cosa si persiste tra le richieste e assicurarsi di poter riutilizzare connessioni e oggetti senza esaurire la memoria perché si dispone di una matrice di un milione di repository

    
risposta data 15.12.2018 - 21:09
fonte

Leggi altre domande sui tag