1) Non è consigliabile che le viste utilizzino direttamente riferimenti esterni o riferimenti esterni caricati in modo dinamico. Astrarre questo facendo interagire la vista con un controller. Fai in modo che il controllore trasmetta un oggetto dati alla tua vista che è noto al momento della compilazione dall'applicazione (in altre parole, un oggetto noto alla tua applicazione Web in fase di compilazione). Questo è per isolare completamente (astratto) il business specifico del plugin dal tuo punto di vista. Quindi fai interagire il tuo controller con il "plugin".
2) Non so come funzioni la vostra "fabbrica personalizzata" ma oggigiorno non costruiamo più "fabbriche personalizzate". Al contrario, sfruttiamo i contenitori di iniezione di dipendenza come Microsoft Unity (o Ninject, o Castle Windsor o ecc.). Creare "fabbriche personalizzate" è molto vecchio stile e in pratica stai reinventando la ruota che è stata risolta con l'iniezione di dipendenza.
3) Per quanto riguarda il caricamento dinamico assembly esterni, non so se lo avete ragione, ma ecco un link:
Dynamically load a type from an external assembly
4) In genere, un design plug espone le interfacce che sono noti alla tua applicazione web principale al momento della compilazione. Ciò che nasconde il design del plugin è l'implementazione che può cambiare da un plugin all'altro. La cosa importante è che ogni plugin implementa le stesse interfacce pubbliche, quelle che sono previste dalla tua app web principale. Di solito, si avranno queste interfacce in un progetto "Comune" separato a cui fanno riferimento entrambi, la propria applicazione web principale e il proprio plugin che implementa tali interfacce. Pertanto, dalla tua app web principale, saprai quali sono le interfacce pubbliche dei tuoi plugin, puoi caricare dinamicamente l'assembly esterno e utilizzare la riflessione C# per trovare le classi che implementano tali interfacce e caricarle nel tuo contenitore di dipendenze. Allo stesso modo, chiunque desideri sviluppare un plug-in per la tua app Web dovrà implementare le interfacce definite nel progetto "Comune".
Nota: "Comune" è solo un nome casuale che ho dato al progetto. Puoi chiamarlo "PluginInterface" o qualsiasi altra cosa tu voglia.
Dopodiché, avere il controller che preleva tutto ciò di cui ha bisogno dal contenitore di iniezione delle dipendenze è banale.
Nota: le interfacce del plug-in avranno probabilmente entità di input e output. Queste entità sono condivise tra la tua app web principale e il tuo plug-in. In tal caso, poiché queste entità fanno parte delle interfacce, devono essere nel progetto "Comune". Potresti essere tentato dal fatto che il tuo controller ritorni tali entità direttamente alla tua vista, ma non avrai un'astrazione perfetta tra la tua vista e il tuo plugin. Non avere astrazioni perfette è per un'altra discussione.
Spero che aiuti!
Non sono sicuro del motivo per cui è necessario caricare l'assieme dopo l'avvio dell'app? Quello non sarebbe un caso d'uso normale per le librerie esterne. – Claies
è qualcosa di simile a un plugin o pensa a applicazioni web modulari come i frutteti cms. in realtà l'assemblea con le sue viste arriva in fase di esecuzione che l'utente dà! :) –
Non credo che questo sia possibile in quanto quando si usa roslyn in un ambiente dnx il compilatore dinamico cerca di risolvere le dipendenze usando project.json come parte del processo di compilazione. L'assembly caricato dinamicamente non verrà elencato in project.json e quindi il compilatore fallirà. Immagino che in teoria sarebbe possibile regolare dinamicamente il project.json prima di riflettere la nuova dipendenza dopo l'avvio e prima che la vista venga caricata, ma onestamente non ho idea se funzionasse e sarebbe un trucco al meglio. Anche se funzionasse, potrebbe rompersi in futuro. –