2

Я создаю приложение-службу с использованием Web API, Core Core и EntityFramework Core.Entity Framework Core DbContext and Dependency Injection

Для настройки параметров в моем DbContext я использую эти строки в методе «ConfigureServices» в Startup.cs

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

Я знаю, что если добавить контекст в качестве параметра конструктора в контроллере .Net будет вставьте контекст в конструктор.

Но это не то поведение, которое я хочу. Я не хочу, чтобы мой веб-api ничего не знал о dbcontext. У меня есть проект DataAccess с классом репозитория, который обрабатывает все операции CRUD.

Это означает, что я просто хочу сказать Repository.AddEvent (evt) в моем контроллере, а затем репозиторий знает, как с этим справиться.

С другой стороны, в репозитории используется простой зависимый преобразователь, чтобы получить правильную реализацию «IDataAdapter». Одна из этих реализаций - SQLDataAdapter. Это тот момент, в котором мне нужен мой контекст.

Как передать свой контекст до этого момента?

ответ

5

Вы можете решить эту проблему, добавив свой dbcontext через инсталляцию конструктора к вашим классам со своего уровня доступа к данным.

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(); 
    } 
} 

Если вы хотите дополнительно настроить, как ваш DbContext впрыскивается в ваш DI контейнер, я предлагаю вам взглянуть на то, что .AddDbContext на самом деле делает. См. https://github.com/aspnet/EntityFramework/blob/1.0.0/src/Microsoft.EntityFrameworkCore/EntityFrameworkServiceCollectionExtensions.cs#L142-L158

Смежные вопросы