2012-09-21 7 views
5

Zunächst gilt meine Frage nur für Web-Apps und ich neigen dazu, die Mehrheit meiner Ninject Bindungen mit einer InRequestScope Auflösung einzurichten.Ninject Rebind zur Laufzeit, kann es als Feature-Toggle verwendet werden?

Ich denke an Möglichkeiten Feature Hin- und Herschalten zu bekommen, und man dachte, dass ich habe, ist zu nennen:

kernel.Rebind<IInterface>().To<RealImplementation>().InRequestScope(); 

, während die Website noch in Betrieb ist, und der Schalter schnippte wurde. Wenn ich dann entscheiden, die Funktion deaktivieren kann ich

kernel.Rebind<IInterface>().To<EmptyImplementation>().InRequestScope(); 

Mein Denken nennt, ist, dass die InRequestScope alle „in progress“ Code-Anforderungen würden zu schützen, werden aber erlauben neue Anforderungen die neu ein- und Funktion zu erhalten.

Kennt jemand aus Erfahrung (oder ein tieferes Verständnis von Ninject), wenn dies funktioniert ist wahrscheinlich, oder wenn es für mich mehr Ärger machen geht. Ich habe bei MEF oberflächlich betrachtet, so dass würde meine nächste Anlaufstelle sein, wenn Ninject nicht das beste Werkzeug für den Job in diesem Fall ist.

Antwort

0

Eine potentielle Problemquelle ist, dass der Kernel zwar threadsicher ist, Sie aber nur einen einzigen Schalter betätigen müssen oder Sie sich in einem Rennen befinden, bei dem alles als atomare Aktion für In-Flight-Anfragen geschaltet wird . (Dies ist im Prinzip, ich habe den Code mit dieser Frage nicht überprüft).

gesagt haben, dass nichts in den Sinn, die direkt ein Problem verursachen könnte.

Aber während es sinnvoll sein, wenn Sie sich selbst und/oder erhalten eine stark genug, um Sicherheit auf jemandem basierend erfüllen können, die den Code auf Basis für Rennbedingungen für diese Art der Verwendung im Zusammenhang beurteilt hat, ist dies nicht eine weit verbreitete Praxis I‘ Ich habe gehört. In der Tat ist das Design von AutoFac so, dass Sie eine unveränderliche Factory aus einer Konfigurationseingabe erstellen und diese Art von Dingen ausdrücklich ausschließen. Mein Instinkt würde sich aus diesem Grund von einer solchen Annäherung abwenden.

Haben Sie mit .ToMethod(ctx=> return /* Toggle-based creation*/) in Betracht gezogen? (Offensichtlich sagt es Dinge nicht so direkt wie ein Rebind tut). Abhängig von Ihrer realen Bedeutung (und der Komplexität sowohl Ihrer Bindungen als auch der Art des Kniehebelsystems) kann dies sinnvoll sein.

+0

Hmmmm interessant. Wenn ich Ihnen also richtig folge, ist es Ihre Idee, die Bindung für ".Methode" zu ersetzen, bei der der Code eine Bedingung pro Aufruf validieren kann (z. B. ist das Flag gesetzt). Ich denke nicht, dass dies zu einem Performance-Overhead führen würde, da meine Annahme ist, dass Ninject pro Aufruf bindet, anstatt ein Return-Ergebnis zu cachen. In diesem Fall würde ich den azurblauen Speicher überprüfen, so dass es eine Prüfstrafe geben würde, aber dies könnte für eine akzeptable Zeit im Cache gespeichert werden. – Dylan

+0

@Dylan Weniger triviale Semantiken wie diese könnten wahrscheinlich in einem [Provider] (https://github.com/ninject/ninject/wiki/Providers%2C-Factory-Methods-and-the-Activation-Context) ausgedrückt werden (der Cache könnte wahrscheinlich über DI verwaltet werden und nur Code sein). Andererseits könnte eine einfache statische Methode die Rechnung ... –

Verwandte Themen