2016-05-27 2 views
3

Ich arbeite die neueste ASP.Net Core RC2, Web-API, nur für Windows. Rahmen 4.6.1.Dependency Injection und Scope?

Ich bin verwirrt über die Rolle des Standard-Repository-Muster gegenüber der Art, wie Core Controller-Abhängigkeits-Injektion behandelt. Ich möchte nur sicherstellen, dass dies der richtige Ansatz ist, da es nicht viel Dokumentation gibt (oder es wird widersprechen).

Die Art, wie ich dies jetzt eingerichtet habe, habe ich eine Standard-Repository-Schnittstelle für CRUD-Operationen und die zugehörige Klasse, die diese Operationen implementiert.

Ich injiziere das Repository in den Controller. Die beiden Schritte, die ich getroffen habe, sind (in Startup.cs, ConfigureServices()):

services.AddSingleton<IMyCustomRepository, MyCustomRepository>(); 

Mein Controller wird dann im Repository unter:

public MyCustomController(IMyCustomRepository repository) { } 

Mein Endziel ist hier EF Kern zu erhalten, einschließlich der InMemoryProvider.

Ist das bis jetzt korrekt gebaut? Eine meiner Hauptsorgen ist, dass ich ständig darüber lese, wie Repository-Muster bei der Verwendung von ORMs wie Entity Framework nicht notwendig sind, bin aber nicht sicher, wie dies für EF Core gilt.

Ich habe gelesen, dass Sie die AddSingleton hier nicht verwenden sollten, wenn Sie EF Core verwenden, weil das von einem DbContext abhängt, der Scoped ist (also sollten Sie das stattdessen verwenden)?

Antwort

3

Wenn Ihre Anwendung Singleton-Verhalten erfordert, verwenden Sie sie. Aber in diesem Fall haben Sie , um die Lebensdauer Ihres Objekts in der Klasse selbst zu verwalten. „Allerdings Framework-Entity Kontexten sein sollte hinzugefügt, um die Dienste Container die Scoped Lebensdauer mit dieser Pflege automatisch genommen wird , wenn Sie die Hilfsmethoden verwenden, wie gezeigt.“ Unten:

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddDbContext<MyDbContext>(options => 
     options.UseInMemoryDatabase() 
    ) 
} 

Repositorys, die Gebrauch machen wird Entity Framework sollte dieselbe Lebensdauer verwenden; das heißt, AddScoped ... So Ihr Code wie so sein sollte:

services.AddScoped<IMyCustomRepository, MyCustomRepository>(); 

„Eines meiner Hauptanliegen ist, dass ich ständig darüber lese, wie Repository-Muster sind nicht notwendig, wenn ORMs wie Entity Framework verwenden, aber ich bin nicht sicher, wie dies für EF Core gilt. "

Sie sollten das Repository-Muster in Ihrem appliation impliment ... Sie sollten lesen, was das Muster

Repository ist, und dann sehen, ob die DbContext und DbSet sie erfüllen.

Dieses Video ansehen: https://www.youtube.com/watch?v=rtXpYpZdOzM

+0

Vielen Dank. Wo "lebt" der "MyDbContext" mit dem Repository-Muster? Ich habe überall auf der Karte Beispiele gesehen. Ich möchte speziell über Core RC2 wissen. Soll dies in das Repository eingefügt und als Mitglied gespeichert werden? Ich habe es auch in 'using()' Blöcken on-demand verpackt gesehen. – Patrick

+0

@Patrick: Sie sollten 'using'-Blöcke nicht in einer Webanwendung mit Abhängigkeitsinjektion/IoC-Container verwenden, da der Container nach dem Verlassen des' using'-Blocks entsorgt wird und alle weiteren Zugriffe während derselben Anfrage fehlschlagen mit einer Ausnahme. ASP.NET Core wird sich um die Entsorgung kümmern, sobald die Anfrage abgeschlossen ist (vorausgesetzt, Sie haben es mit Gültigkeitsdauer registriert) – Tseng

+0

@Tseng Einverstanden. Soll der DbContext in diesem Setup über den Konstruktor in das Repository eingefügt und als Member gespeichert werden? – Patrick