J'ai une idée, mais j'ai besoin d'aide pour l'implémenter.Sérialisation de délégués dans WCF à l'aide d'un substitut?
WCF ne prend pas en charge les délégués dans ses contrats. Au lieu de cela, il a un lourd mécanisme de contrats de rappel, et je cherche un moyen de surmonter cette limitation.
J'ai pensé à utiliser un IDataContractSurrogate
pour remplacer chaque délégué du contrat par un jeton qui sera sérialisé vers le point de terminaison distant. Là, le jeton sera désérialisé en un délégué généré. Ce délégué générera un message de rappel générique qui encapsule tous les arguments (avec lesquels le délégué a été appelé).
Le message de rappel générique atteindra le premier point de terminaison, et là le délégué d'origine sera invoqué avec les arguments.
Voici la séquence purposed (simplifiée):
- A appelle B-proxy.Foo (rappel)
- rappel est sérialisé par un DelegateSurrogate.
- Les DelegateSurrogate stocke le délégué dans un stockage délégué dédié et le remplace par un jeton
- Le message arrive au point final de B
- le jeton est désérialisée par un DelegateSurrogate
- Le DelegateSurrogate construit un délégué généré
- B.Foo (generatedCallback) est appelé
- Plus tard, B appelle generateCallback (args)
- generatedCallback (args) appelle un contrat générique dédié sur le point de terminaison A: Callback Contrat-proxy.GenericCallback (args)
- CallbackContract.GenericCallback (args) est invoquée sur le point final d'un
- Le rappel d'origine est récupéré à partir du stockage et est invoquée: rappel (args)
J'ai déjà mis en œuvre ce bus de service utilisant précédemment (NServiceBus
), mais je veux adapter l'idée à WCF et j'ai du mal à le faire. Je sais comment mettre en œuvre les étapes 3,6,9 et 11. Je ne sais pas encore comment câbler tout dans WCF - en particulier la partie de substitution.
C'est tout - J'espère que ma question a du sens, et que la sagesse collective ici sera en mesure de m'aider à construire cela.
Voici un exemple d'utilisation pour ma solution désirée:
// client side
remoteSvc.GetEmployeeById(17, emp =>
{
employees.Add(emp);
logger.log("Result received");
});
// server side
public void GetEmployeeById(int id, Action<Employee> callback)
{
var emp = getEmpFromDb(id);
callback(emp);
}
Pourquoi le mécanisme de rappel standard est-il «encombrant»? –
parce que vous avez besoin d'un code standard pour l'utiliser, et vous aurez besoin d'apprendre ce mécanisme. Aussi - Je ne crois pas que cela fonctionnera dans des canaux à sens unique comme MSMQ. Les délégués en tant que rappels sont plus intuitifs car ils ressemblent à du code C# régulier. –