2010-04-20 10 views
8

Si un programme a littéralement désérialisé un objet (cela n'a pas vraiment d'importance, mais simplement que BinaryFormatter a été utilisé).Réinjecter les dépendances d'un objet fraîchement désérialisé

Quelle est une bonne conception à utiliser pour réinjecter les dépendances de cet objet?

Y at-il un modèle commun pour cela?

Je suppose que j'aurais besoin d'enrouler la méthode Deserialize() pour faire office d'usine à l'intérieur du conteneur.

Merci!

Répondre

10

Vous ne devez pas sérialiser des objets avec des dépendances qui ne peuvent pas être elles-mêmes sérialisées. Au lieu de cela, divisez-le en deux classes: extrayez les parties sérialisables dans une classe distincte. Après la désérialisation, vous pouvez associer l'objet résultant à une instance de la classe d'origine (celle avec des dépendances).

+1

"Tous les problèmes en informatique peuvent être résolus par un autre niveau d'indirection, à l'exception du problème de trop de couches d'indirection." –

+0

Je pense à ma suggestion comme * enlever * une couche d'indirection. (Ou au moins enlever le besoin d'un supplémentaire!);) –

+0

Avouez Jeff, c'était une solution possible qui a traversé l'arrière de mon esprit. Je l'ai implémenté maintenant et la base de code est meilleure :) – nbevans

0

J'utiliserais l'attribut OnDeserialized pour pointer vers une méthode qui effectuerait la réinjection.

+0

Mais cela exigerait sûrement une dépendance sur le conteneur lui-même, c'est-à-dire en brisant la règle de l'IoC? – nbevans

+0

Pas vrai si vous utilisez quelque chose comme Microsoft.Practices.ServiceLocation vous êtes neutre au niveau du conteneur. –

+0

Conteneur neutre, mais toujours dépendante du conteneur. –

0

Unity a un concept de "BuildUp" où vous pouvez lui demander de remplir les dépendances d'un objet existant. Je ne sais pas si autofac (que je suppose que vous utilisez des étiquettes) a un équivalent.

+1

L'injection de propriété est l'équivalent Autofac –