2

Ich baue eine Dienstanwendung mit Web-API, .Net Core und EntityFramework Core.Entity Framework Core DbContext und Dependency Injection

Für Optionen in meinem DbContext Konfiguration ich diese Zeilen in „ConfigureServices“ -Methode in Startup.cs bin mit

var connection = @"Server=ISSQLDEV;Database=EventManagement;Trusted_Connection=True;"; 
services.AddDbContext<EMContext>(options => options.UseSqlServer(connection)); 

Ich weiß, dass wenn ich den Kontext als Konstrukteur Parameter in der Steuerung .Net hinzufügen wird Fügen Sie den Kontext in den Konstruktor ein.

Aber das ist nicht das Verhalten, das ich will. Ich möchte nicht, dass meine Web-API etwas über den dbcontext weiß. Ich habe ein DataAccess-Projekt mit einer Repository-Klasse, die alle CRUD-Operationen abwickelt.

Das bedeutet, dass ich nur sagen möchte Repository.AddEvent (evt) in meinem Controller und dann Repository weiß, wie damit umzugehen.

Auf der anderen Seite verwendet das Repository einen einfachen Abhängigkeits-Resolver, um die richtige "IDataAdapter" -Implementierung zu erhalten. Eine dieser Implementierungen ist SQLDataAdapter. Das ist der Punkt, an dem ich meinen Kontext brauche.

Wie kann ich meinen Kontext bis zu diesem Punkt weitergeben?

Antwort

5

Sie können dies lösen, indem Sie Ihren dbcontext über Konstruktorinjektion zu Ihren Klassen von Ihrer Datenzugriffsebene hinzufügen.

public class Startup 
{ 
    public void ConfigureServices(IServiceCollection services) 
    { 
     services.AddDbContext<ApplicationDbContext>(o => o.UseSqlServer(myConnStr)); 
     services.AddScoped<Repository>(); // 'scoped' in ASP.NET means "per HTTP request" 
    } 
} 

public class MvcController 
{ 
    private Repository repo; 
    public MvcController(Repository repo) 
    { 
     this.repo = repo; 
    } 

    [HttpPost] 
    public void SomeEndpoint() 
    { 
     this.repo.AddFoo(new Foo()); 
    } 
} 

public class Repository 
{ 
    private DbContext db; 
    public Repository(ApplicationDbContext db) 
    { 
     this.db = db; 
    } 

    public void AddFoo(Foo obj) 
    { 
     this.db.Set<Foo>().Add(obj); 
     this.db.SaveChanges(); 
    } 
} 

Wenn Sie weiter anpassen möchten, wie Sie Ihre DbContext in Ihre DI-Container eingespritzt wird, schlage ich vor, Sie schauen, was .AddDbContext tatsächlich tun. Siehe https://github.com/aspnet/EntityFramework/blob/1.0.0/src/Microsoft.EntityFrameworkCore/EntityFrameworkServiceCollectionExtensions.cs#L142-L158