2012-12-27 4 views
6

Wir haben eine ASP.NET MVC App, die IoC verwendet, um Service-Referenzen in Controller und Repository-Referenzen in Services einzufügen.Mit IoC kann ein Singleton mit Objekten injiziert werden, die eine transiente Lebensdauer haben?

Controller müssen eine Lebensdauer von Transient haben, da sie pro Anfrage instanziiert werden müssen. Wenn jedoch der gesamte IoC-Stack pro Anfrage neu aufgebaut wird, wird dies ein wenig Overhead. Wir haben mehr Abhängigkeiten, als ich möchte, und eine Option wäre, mehr Controller zu haben, die jeweils weniger Abhängigkeiten im Stack haben. Aber wenn ich das jetzt beiseitelasse, ist meine Frage: Wenn ein Objekt, das als Singleton injiziert wird, Abhängigkeiten mit einer vorübergehenden Lebenszeit hat, werden diese Abhängigkeiten im Grunde genommen wie Singletons behandelt, weil es dem Singleton gehört?

Insbesondere dann, wenn wir den folgenden

RepositoryA haben (muss vorübergehend sein, da aktuelles Design einen Benutzerkontext in Konstruktor injiziert) ServiceA (Singletons) ControllerA (transient)

wie so instanziiert:

Wird RepositoryA im Wesentlichen einmal instanziiert, weil ServiceA einmal instanziiert wird?

Ich bin 99% sicher, die Antwort ist ja, aber wollte nur die Menge an Refactoring bestätigen, die ich hier tun muss.

Auch unter der Annahme, dass Dienste und Repositorys KEINE benutzer-/anforderungsspezifischen Instanzvariablen als Designansatz haben, gibt es einen Grund, keine Singleton-Lebensdauer für sie zu verwenden?

+0

Ich denke, die wirkliche Frage ist, warum muss es ein Singleton sein? – dotjoe

+0

@dotjoe das ist nicht die wirkliche Frage, aber trotzdem ein sehr guter Punkt :-). Es erscheint mir merkwürdig, dass ein solcher Dienst als Singleton konfiguriert ist.Irgendwelche Leistungsprobleme? – Steven

+0

Außerdem ist die Verwendung einer 'Service'-Klasse, die Geschäftslogik enthält, etwas, das ich heutzutage gerne verhindern möchte. Wenn Sie interessiert sind, werfen Sie einen Blick auf [dieser Artikel, der beschreibt, beschreibt Geschäftsvorgänge/Anwendungsfälle als Nachrichten] (http://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=91). – Steven

Antwort

4

, wenn ein Objekt, das als ein Singleton eingespritzt wird, weist Abhängigkeiten, die eine transiente Lebensdauer haben, werden diese Abhängigkeiten werden im wesentlichen wie singletons auf Grund des Singleton Besitz zu behandelnden Patienten?

Das stimmt. Da solche Komponenten ihre Abhängigkeiten beibehalten (indem sie ihre Referenzen in einem privaten Feld speichern), bleiben diese Abhängigkeiten so lange bestehen wie die Komponente selbst. Mit anderen Worten, ihre Lebensdauer wird implizit auf die Lebensdauer der Komponente übertragen (wenn ihre Lebensdauer kürzer ist).

Wenn Sie dies haben, ist Ihre DI-Konfiguration sicherlich falsch und früher oder später wird dieser Fehler angezeigt. Vermutlich nur in der Produktion und fast nie auf Ihrer Dev-Maschine: -S.

Im Allgemeinen sollten alle Komponenten, die vom Container verwaltet werden, nur auf Abstraktionen angewiesen sein, deren Lebensdauer gleich oder länger als die der Komponente selbst ist.

Einige Frameworks verfügen sogar über Analysedienste, um diese Art von Konfigurationsfehlern zu erkennen. Trotzdem sollten Sie beim Verdrahten aller Abhängigkeiten sehr vorsichtig sein. Im Allgemeinen wäre es am sichersten, Komponenten wann immer möglich als vorübergehend zu konfigurieren, da eine transiente Komponente Abhängigkeiten jeglicher Lebensweise enthalten kann. Viele transiente Objekte wären normalerweise kein Leistungsproblem. Das Erstellen eines ziemlich großen Objektdiagramms pro Webanforderung wäre normalerweise schnell genug (andernfalls versuchen Sie, zu einer DI framework with a higher throughput zu wechseln).

+0

Danke für den DI-Framework-Link (obwohl ich vollständige Offenlegung sehen würde wäre, dass Sie für Simple Injector (-;) - zu diesem Zeitpunkt ziemlich schwer zu wechseln, aber verlockend. – sydneyos

+0

Ich entwickle Simple Injector, das ist wahr :-) . Der Link sollte nicht SI fördern, sondern Ihnen einen Eindruck von den Eigenschaften der verschiedenen Frameworks geben. Wenn das Frameworks-Framework jedoch schwierig ist, müssen Sie sich vielleicht das Design Ihrer Anwendung ansehen. Ihre Anwendung ist möglicherweise zu abhängig vom Framework. Dies beeinträchtigt die Wartbarkeit und Testbarkeit Ihrer Anwendung. Obwohl der Simple Injector allen meinen DI-Anforderungen entspricht, verhindere ich immer, dass ich eine direkte Abhängigkeit von SI benötige. Auch für meine eigenen Anwendungen. – Steven