J'ai réfléchi à la possibilité d'appliquer le modèle DI sans encourir le coût des appels de méthode virtuelle (ce qui, selon les expériences que j'ai faites, peut être jusqu'à 4 fois plus lent que les appels non virtuels). La première idée que j'avais était de faire l'injection de dépendance via génériques:Injection de dépendances dans .Net sans appels de méthode virtuelle?
sealed class ComponentA<TComponentB, TComponentC> : IComponentA
where TComponentB : IComponentB
where TComponentC : IComponentC
{ ... }
Malheureusement, le CLR fait encore appelle la méthode via les interfaces même lorsque les mises en œuvre concrètes de TComponentB et TComponentC sont spécifiés en tant que paramètres de type générique et toutes les classes sont déclaré comme scellé. La seule façon d'obtenir que le CLR effectue des appels non virtuels consiste à remplacer toutes les classes par des structures (qui implémentent les interfaces). Utiliser struct n'a pas vraiment de sens pour DI et rend le problème ci-dessous encore plus insoluble.
Le deuxième problème avec la solution ci-dessus est qu'il ne peut pas gérer les références circulaires. Je ne peux penser à aucun moyen, que ce soit par le code C#, ou en construisant des arbres d'expression, pour gérer des références circulaires car cela impliquerait des types génériques infiniment récursifs. (.Net supporte les types génériques en se référant à lui-même, mais il ne semble pas généraliser à ce cas.) Puisque seules les structures peuvent faire contourner les interfaces par le CLR, je ne pense pas que ce problème puisse être résolu. structures pourrait provoquer un paradoxe.
Il n'y a qu'une seule autre solution à laquelle je peux penser et c'est garanti: émettre toutes les classes à partir de zéro à l'exécution, en les basant peut-être sur des classes compilées en tant que modèles. Pas vraiment une solution idéale cependant.
Quelqu'un a de meilleures idées? Edit: En ce qui concerne la plupart des commentaires, je suppose que je devrais dire que cela est classé sous "pure curiosité intellectuelle" J'ai débattu de savoir si demander cela parce que je me rends compte que je n'ai aucun cas concret dans lequel il est nécessaire. J'y pensais juste pour m'amuser et je me demandais si quelqu'un d'autre était tombé dessus avant.
4 fois plus lentement? Je trouve cela difficile à croire. Je classerais cela sous "Optimisation prématurée" ... – BFree
Ceci est pour un projet personnel, sans délais, donc je me laisse aller à une optimisation prématurée :) – jthg
@jthg - L'optimisation prématurée peut faire plus mal que des délais. –