Scheint mir, dass Sie premature optimization tun: tun Sie es nicht.
Die Ersteller Ihrer Dienste sollten nothing more als Speichern der Abhängigkeiten, die es in privaten Feldern dauert, tun. In diesem Fall ist die Erstellung eines solchen Objekts wirklich gering. Vergessen Sie nicht, dass die Erstellung von Objekten in .NET sehr schnell ist. In den meisten Fällen ist es aus Performanceperspektive egal, ob diese Abhängigkeiten injiziert werden oder nicht. Besonders im Vergleich zur Anzahl der Objekte spuckt der Rest Ihrer Anwendung (und die von Ihnen verwendeten Frameworks) aus. Die tatsächlichen Kosten entstehen, wenn Sie beginnen, Webdienste, Datenbanken oder das Dateisystem (oder I/O im Allgemeinen) zu verwenden, weil sie eine viel größere Verzögerung verursachen.
Wenn die Schöpfung wirklich teuer ist, sollten Sie verstecken normalerweise die Schaffung hinter einem Virtual Proxy stattdessen ein Lazy<T>
in jedem Verbraucher der Injektion, da dieser Code gemeinsame Anwendung ermöglicht die Tatsache, zu bleiben nicht bewusst, dass es ein Mechanismus ist, die Schöpfung zu verzögern (Sowohl Ihr Anwendungscode als auch Ihr Testcode werden dabei immer komplexer).
Kapitel 6 von Dependency Injection in .NET, second edition enthält eine ausführlichere Diskussion über Lazy und Virtual Proxies.
jedoch ein Lazy<T>
verbraucht nur 20 Bytes des Speichers (und eine andere für seine 24 bytes gewickelten Func<T>
, einen 32-Bit-Prozess unter der Annahme) und die Erzeugung einer Instanz Lazy<T>
praktisch frei. Sie müssen sich also keine Gedanken darüber machen, es sei denn, Sie befinden sich in einer Umgebung mit sehr engen Speicherbeschränkungen.
Und wenn Speicherverbrauch ein Problem ist, versuchen Sie, Dienste mit einer Lebensdauer zu registrieren, die größer als transient ist. Sie können eine pro Anfrage, per Web-Anfrage oder Singleton machen. Ich würde sogar sagen, dass Sie in einer Umgebung, in der das Erstellen neuer Objekte ein Problem darstellt, wahrscheinlich nur Singleton-Dienste verwenden sollten (aber es ist unwahrscheinlich, dass Sie an einer solchen Umgebung arbeiten, da Sie eine Web-App erstellen). .
Beachten Sie, dass Ninject eine der langsameren DI-Bibliotheken für .NET ist. Wenn das dich beunruhigt, switch to a faster container. Einige Container weisen eine Leistung auf, bei der Objektgrafiken von Hand neu erstellt werden. aber auf alle Fälle, Profil dies, viele Entwickler wechseln DI-Bibliotheken aus den falschen Gründen.
Beachten Sie, dass die Verwendung von Lazy<T>
als Abhängigkeit leaky abstraction (eine Verletzung der Dependency Inversion Principle) ist. Bitte lesen Sie this answer für weitere Informationen.
Was ist eigentlich dein Problem? Warum willst du diese Instanzen nicht? –
Ich möchte UserManager während der Arbeit des Controllers, aber RoleManager wird nicht benötigt und umgekehrt. Wenn Sie über die Lazy Instanzen sprechen, dann ist das keine große Sache, sie im Speicher zu haben, aber ist das der einzige Weg? –
xwrs
Warum ist es eine große Sache für 'UserManager' und' RoleManager'? Ihre Konstrukteure sollten ohnehin keine schwere Arbeit verrichten. –