2016-07-19 11 views
9

Ich versuche, eine asp.net-Anwendung auf asp.net Kern portieren. Ich habe Property-Injektion (mit Ninject) auf meine UnitOfWork-Implementierung wie folgt.Property Injection in Asp.Net Core

[Inject] 
public IOrderRepository OrderRepository { get; set; } 
[Inject] 
public ICustomerRepository CustomerRepository { get; set; } 

Gibt es eine Möglichkeit, die gleiche Funktionalität mit integrierten DI auf .net-Kern zu erreichen? Ist es auch möglich, Convention-basierte Bindung zu verwenden?

+0

Verwandte: https://stackoverflow.com/questions/39849142/when-to-use-property-injection – Steven

Antwort

10

Nein, wird der Einbau-DI/IoC Behälter absichtlich einfach gehalten sowohl in der Nutzung und verfügt über eine Basis für andere DI Behälter anzubieten, sondern auch in steckbar.

So gibt es keine integrierte Unterstützung für: Auto-Discovery Auto-Registrierungen, Dekorateure oder Einspritzdüsen oder Konvention basiert Registrierungen. Es gibt auch keine Pläne, dies dem eingebauten Container hinzuzufügen, soweit ich weiß.

Sie werden einen Dritten Behälter mit Eigentum Injektionsträger verwenden.

Bitte beachten Sie, dass Property Injection in 98% aller Szenarien als schlecht angesehen wird, da es Abhängigkeiten verbirgt und es keine Garantie gibt, dass das Objekt beim Erstellen der Klasse injiziert wird.

Mit Konstruktor Injektion können Sie dies über Konstruktor erzwingen und prüfen für null und die nicht die Instanz der Klasse erstellen. Mit Property-Injection ist dies unmöglich und während Unit-Tests ist es nicht offensichtlich, welche Dienste/Abhängigkeiten die Klasse benötigt, wenn sie nicht im Konstruktor definiert sind, so leicht zu übersehen und NullReferenceExceptions zu erhalten. Der einzige gültige Grund für Property Injection, den ich je gefunden habe, war die Injektion von Diensten in Proxy-Klassen, die von einer Bibliothek eines Drittanbieters generiert wurden, d.h. WCF-Proxies, die von einer Schnittstelle erstellt wurden, auf die Sie keine Kontrolle über die Objekterstellung haben.

Vermeiden Sie es überall anderes.