Estensione di RealProxy
L'estensione del proxy puo` risultare utile quando si desidera partecipare, tra l'altro, al processo di creazione del proxy, al marshalling o all'identita` dell'oggetto. E` possibile generare un proxy personalizzato mediante la classe RealProxy estensibile. Per generare un proxy personalizzato, e` necessario derivare una classe dalla classe RealProxy ed eseguire l'override del metodo RealProxy.Invoke. E` possibile intercettare l'istruzione new (New in Visual Basic) mediante la derivazione dall'attributo ProxyAttribute e l'applicazione dell'attributo a un elemento figlio di ContextBoundObject. Non e` supportata l'applicazione dell'attributo proxy a un elemento figlio di MarshalByRefObject. Quando si chiama new, mediante l'attributo ProxyAttribute derivato viene creata un'istanza del proxy personalizzato. E` inoltre possibile creare direttamente un'istanza del proxy personalizzato nell'applicazione.
Quando un metodo e` chiamato tramite il codice dell'applicazione su un proxy personalizzato, il metodo RealProxy.Invoke sottoposto a override viene chiamato con un oggetto che implementa IMessage. L'implementazione di IMessage fornisce un'implementazione di IDictionary che rende disponibili coppie di informazioni nome/valore relative al metodo. Per ulteriori informazioni su determinate voci del dizionario, vedere la documentazione di riferimento sull'interfaccia IMessage e le interfacce correlate, IMethodCallMessage e IMethodReturnMessage.
Per chiamare un oggetto reale dal metodo Invoke sottoposto a override, chiamare RemotingServices.ExecuteMessage per inviare la chiamata all'oggetto reale.
E` inoltre possibile utilizzare il metodo EnterpriseServicesHelper.CreateConstructionReturnMessage per elaborare un'implementazione di IConstructionCallMessage e generare un'implementazione di IConstructionReturnMessage. Per creare l'oggetto di supporto, inoltre, e` possibile utilizzare il metodo RealProxy.InitializeServerObject.
Quando si utilizza l'attributo ProxyAttribute derivato, e` possibile creare un oggetto reale nel metodo ProxyAttribute.CreateInstance sottoposto a override e memorizzarlo come campo nel proxy personalizzato. Il proxy personalizzato puo` eseguire il marshalling dell'oggetto reale per ottenere l'oggetto ObjRef contenente l'URI (Uniform Resource Identifier), il quale deve essere archiviato nel proxy, poiche´ la voce "__Uri" contenuta nell'insieme restituito dalla proprieta` IMessage.Properties deve essere impostata nell'implementazione di IMessage per consentire l'invio di una chiamata a un oggetto reale.
Il messaggio non deve ovviamente essere inviato su un oggetto reale. E` possibile utilizzarlo per eseguire alcune attivita` in Invoke , nonche´ generare e restituire un oggetto che implementi l'interfaccia IMethodReturnMessage.
Per partecipare al marshalling, eseguire l'override di RealProxy.CreateObjRef e fornire un oggetto ObjRef personalizzato che estenda ObjRef. Per aggiungere dati personalizzati all'oggetto ObjRef personalizzato, eseguire l'override di GetObjectData. Dati e delegato personalizzati si aggiungono al metodo ObjRef.GetObjectData per modificare le funzionalita` relative all'identita` dell'oggetto del sistema di marshalling di .NET Remoting.
Nel corso della deserializzazione, mediante il sistema .NET Remoting viene chiamato IObjectReference.GetRealObject, sottoposto a override, sull'oggetto ObjRef personalizzato. E` necessario delegare il metodo ObjRef.GetRealObject di base poiche´ esso gestira` l'identita` dell'oggetto e impostera` i canali di comunicazione remota. Anche il metodo ProxyAttribute.CreateProxy sottoposto a override verra` chiamato dalla base per consentire di impostare il proxy personalizzato.
E` possibile utilizzare ObjRef.IsFromThisAppDomain e ObjRef.IsFromThisProcess per determinare le modalita` di esecuzione dell'unmarshalling.
Se nel corso del marshalling non viene fornito un oggetto ObjRef personalizzato, il sistema .NET Remoting eseguira` automaticamente il marshalling e l'unmarshalling dell'oggetto e il proxy personalizzato non verra` utilizzato nel dominio applicazione del chiamante.
Vedere anche
Riferimenti
RealProxy
ProxyAttribute
RemotingServices
IMessage
IMethodReturnMessage
IMethodCallMessage