2015-05-22 6 views
13

Ho un'applicazione Web che dovrebbe essere composta come una serie di plugin in un'infrastruttura principale. Un plugin è una dll CLR compilata + alcuni file di contenuto che verranno inseriti in una determinata posizione. Sto usando Autofac per scansionare e registrare i tipi fuori dall'assemblaggio, e qualche routing elaborato per servire controllori e risorse da lì. Ma dato che ogni assembly di plugin può contenere un DbContext (per convenzione ognuno utilizzerà il proprio database), non riesco a capire bene cosa fare lì.EF multi-contesto con un sistema in stile plugin. Come applicare le migrazioni in fase di runtime?

Ora ho trovato molte cose su come utilizzare più contesti, ma tutto ciò richiede di sapere quali saranno questi in fase di sviluppo. La mia applicazione non sa quali contesti saranno usati fino al runtime.

Quello che sto cercando gode di un'ottima vorrei è un modo di fare

ApplyMigrations<MyDbContext, MyDbConfiguration>(); 

Anche se vorrei anche avere qualche modo per fornire un insieme ordinato di migrazioni da applicare (se si utilizza migrazioni espliciti).

dove sto inciampando è attualmente lo standard

Database.SetInitializer(...) 

in quanto si tratta di un Singleton statica e ogni DbContext nel mio sistema ha la propria inizializzazione.

+0

Avete pensato di caricare ogni plugin in un dominio di applicazione separata? Probabilmente ha senso per te farlo comunque ed è probabile che tu possa aggirare questo. –

+0

@LukeMcGregor ma questa è un'applicazione Web e IIS gestisce domini app, quindi come gestirlo? –

+0

Non penso che ci sia alcun problema nel creare domini app in un'app web, un progetto su cui ho lavorato di recente aveva un sistema di plugin che usava domini app. Li abbiamo utilizzati in webapp e servizi senza problemi. –

risposta

1

Prima di tutto, SetInitializer memorizza gli oggetti IDatabaseInitializer in un dizionario con il tipo di contesto come chiave, quindi in teoria le chiamate multiple di SetInitializer dovrebbero funzionare correttamente.

D'altra parte, se questo non funziona, un'altra opzione è quella di eseguire in modo esplicito l'inizializzazione:

class YourContext : DbContext 
{ 
    static YourContext() 
    { 
     Database.SetInitializer<YourContext>(YourMigratingDatabaseInitializer); 
     using (var context = new YourContext()) 
     { 
      context.Database.Initialize(false); 
     } 
    } 

    public YourContext() 
    { 
     Database.SetInitializer<YourContext>(null); 
    } 
} 
+0

ooooh, ho dimenticato il parametro type, holy cow. Ok, dovrò provare questo domani. Sembra che potrebbe funzionare –

+0

Btw, in genere non è necessario specificare il parametro type perché viene inferito dal tipo di inizializzatore – jjj

1

Forse scrivere un'interfaccia per il bootstrap di un plug-in, quindi IPluginBootstrapper - da qui puoi passare in un ContainerBuilder da aggiungere a una raccolta di servizi fornita dal plugin, o restituire un contenitore costruito che il plugin crea e combinarlo sul ospite. In questo modo, si sta assumendo la responsabilità di tutte le attività di seed/migrazione di DB in ciascun plug-in, quindi quando si rilascia una nuova dll, quando è bootstrap può eseguire il proprio percorso di aggiornamento.

Un'altra alternativa, forse si può avere una sezione di configurazione che definisce una coppia di tipi, in modo da Tuple e dire Autofac di trovare tutte le coppie di questi nella directory dei plugin, e quindi chiamare SetInitializer con ciò che è stato risolto?

+0

sì, questo è esattamente quello che sto facendo già, il problema è come esattamente avviare la migrazione quando 'Database.SetInitializer' è statico –

+0

Penso che jjj ce l'abbia - Non posso prevedere alcun problema con la chiamata un Database.SetInitializer dal plugin durante l'inizializzazione – leon

+2

Hanno tentato una semplice demo per provare questo, sembra che l'impostazione delle migrazioni di inizializzazione all'interno di ciascun plugin dovrebbe funzionare. Demo su https://github.com/leonio/StackOverflow.MultiMigrations – leon

Problemi correlati