2

웹 API, .Net Core 및 EntityFramework Core를 사용하여 서비스 응용 프로그램을 작성합니다. Startup.cs에서 "ConfigureServices"방법 나는이 라인을 사용하고 내 DbContext에서 옵션을 구성엔티티 프레임 워크 핵심 DbContext 및 종속성 삽입

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

내가 알고 내가 컨트롤러에서 생성자 매개 변수로 컨텍스트를 추가하는 경우 닷넷 것 생성자에 컨텍스트를 삽입합니다.

그러나 이것은 내가 원하는 행동이 아닙니다. 내 웹 API가 dbcontext에 대해 아는 것을 원하지 않는다. 모든 CRUD 작업을 처리하는 저장소 클래스가있는 DataAccess 프로젝트가 있습니다.

이것은 내 컨트롤러에 Repository.AddEvent (evt)라고 말하고 저장소를 처리하는 방법을 알고 있음을 의미합니다.

반면 리포지토리는 간단한 "dependency resolver"를 사용하여 적절한 "IDataAdapter"구현을 얻습니다. 이러한 구현 중 하나는 SQLDataAdapter입니다. 이것이 내가 필요한 맥락이다.

문맥을이 시점까지 어떻게 전달할 수 있습니까?

답변

5

데이터 액세스 레이어의 클래스에 생성자 삽입을 통해 dbcontext를 추가하여이 문제를 해결할 수 있습니다. 당신이 더 당신의 DbContext가 당신의 DI 용기에 주입하는 방법을 사용자 정의하려면

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

, 나는 당신이 .AddDbContext이 실제로 무엇을하고 있는지 살펴 좋습니다. https://github.com/aspnet/EntityFramework/blob/1.0.0/src/Microsoft.EntityFrameworkCore/EntityFrameworkServiceCollectionExtensions.cs#L142-L158

을 참조하십시오.