Soluzione alternativa. Il dominio dell'applicazione .net passa solo oggetti per valore
-
11-07-2019 - |
Domanda
Sto sviluppando un'applicazione .net che dipende fortemente dai plugin. L'applicazione stessa contiene una connessione a un server remoto.
Recentemente ho scavato nei domini dell'applicazione e li vedo come la soluzione ideale per isolare il codice del plugin dal resto dell'applicazione.
Tuttavia, c'è un grosso svantaggio che mi rende incapace di implementare i domini delle applicazioni per l'hosting dei plugin. Sembra che non ci sia modo di passare un oggetto facendo riferimento a un altro dominio dell'applicazione necessario per passare un riferimento all'oggetto connessione.
Speravo che qualcuno potesse darmi una soluzione alternativa in modo da poter passare un riferimento a quell'oggetto.
Nota: la creazione di un proxy è fuori discussione, il livello di connessione funge già da proxy poiché le classi vengono generate automaticamente.
Nota2: System.AddIn non può essere utilizzato in quanto non è disponibile nel framework compatto.
Soluzione
Hai provato a derivare da MarshalByRefObject ? È un dolore in quanto rovina la tua gerarchia ereditaria, ma penso che sia quello che vuoi.
Dai documenti:
MarshalByRefObject è la classe base per oggetti che comunicano attraverso confini del dominio dell'applicazione per scambiare messaggi usando un proxy. Oggetti che non ereditano MarshalByRefObject è implicitamente maresciallo per valore. Quando un telecomando l'applicazione fa riferimento a un maresciallo di valore oggetto, una copia dell'oggetto è passato attraverso il dominio dell'applicazione confini.
Gli oggetti MarshalByRefObject sono accessibile direttamente dal confini dell'applicazione locale dominio. La prima volta un'applicazione in un dominio di applicazione remoto accede a un MarshalByRefObject, un proxy viene passato all'applicazione remota. Le chiamate successive sul proxy sono ritornò all'oggetto residente nel dominio dell'applicazione locale.
I tipi devono ereditare da MarshalByRefObject quando il tipo è utilizzato nel dominio dell'applicazione confini e lo stato del l'oggetto non deve essere copiato perché il file i membri dell'oggetto non sono utilizzabili all'esterno del dominio dell'applicazione dove sono stati creati.
Nella mia esperienza, può essere piuttosto limitante: devi davvero fare il meno possibile oltre il limite di AppDomain, preferibilmente limitandoti alle operazioni che richiedono solo tipi, stringhe e array primitivi di entrambi. Ciò potrebbe essere dovuto alla mia inesperienza nel lavorare con più AppDomain, ma è solo un avvertimento che è un po 'un campo minato.
Altri suggerimenti
Per parlare con la stessa istanza tra AppDomains, è necessario ereditare da MarshalByRefObject . Fatto in questo modo, ogni chiamata di metodo all'oggetto (incluse proprietà ecc.) È in realtà una chiamata remota all'altro dominio di app. Questo aiuta?
Tieni presente che la pulizia dei proxy MarshalByRefObject
viene ripulita in base a un contratto di locazione. In breve, se non si utilizza l'oggetto per un tempo specifico, verrà recuperato. Puoi controllarlo sovrascrivendo InitializeLifetimeService
per restituire un oggetto di leasing che soddisfa le tue esigenze. Se si restituisce null
si disabilita effettivamente il leasing e quindi l'oggetto viene recuperato solo quando AppDomain viene scaricato.