2017-02-28 4 views
0

ASP.Net Core로 이동하기 전에 Ninject을 사용하여 일반적인 방식으로 내 엔터티 프레임 워크 데이터베이스 컨텍스트를 삽입 할 수있었습니다. 예를 들면 다음과 같습니다 AddDbContext를 사용하는 경우 다음과 같은 처리를 할 경우 ASP.Net 코어 MVC에서ASP.Net Core MVC : 기본 유형별 종속성 삽입

Bind<DbContext>().To<MyActualDbContext>(); 

는, 그것이 해결되지 않은되는 서비스가 발생합니다.

AddDbContext<MyActualDbContext>(x=> x.UseSqlServer("...")); 
--- 
public class TestController: Controller { 
    public DbContext Db {get; private set;} 
    public TestController(DbContext Db){ 
     this.Db = Db; 
    } 
} 

내가 AddDbContext 특별히 EF 데이터 컨텍스트를 처리하는 데 사용하도록 개발 되었기 때문에 나는, 그러나, AddSingleton 또는 AddScoped를 사용을 통해이 문제를 해결할 수 있다는 것을 알고, 나는 어떤 방법이 있는지 알고 싶습니다 그 방법을 사용하여 이것을 달성하십시오.

AddDbContext이이 동작을 지원하지 않는 경우 어떤 대체 방법이 더 좋을지 AddSingletone 또는 AddScoped? 나는 AddScoped가 요청 당 한 번 서비스를 인스턴스화하지만, Singleton이 잠재적 인 문제를 일으키는 지 여부를 알고 싶다. 이 두 메서드를 사용하면 ED DbContext의 경우 단점이 발생하지 않도록하고 싶습니다. 기본 클래스는 당신이 그것을 사용할 수 있도록 중 DbSets있어이 없기 때문에

답변

2

에 캐스팅없이, 당신은

// Or use AddTransient, makes no difference as it only wraps around the 
// container resolve method 
services.AddScoped<DbContext>(provider => provider.GetRequiredService<MyActualDbContext>()); 

를 사용할 수 있지만 솔직히 나는 그렇게 혜택을 볼 수 없습니다 원래 코드 였지만, 이것은 IOC가 전혀 없다는 생각을 깨는 것입니다.

그리고 네, 싱글 톤 DbContext는 문제가 있습니다. 메모리 누수가 발생할 수 있습니다 (추적 캐시가 계속 커질 것입니다). 그리고 어딘가에 처분하면 DI 시스템은 항상 싱글 톤 컨텍스트의 폐기 된 인스턴스를 반환합니다.

+0

DbContext에는 "Set <>, Add <>, Entity <> 등과 같은 메서드가 있습니다. db를 일반적인 방법으로 사용할 수 있습니다. 동일한 db에 대해 서로 다른 컨텍스트가 있다고 가정합니다. – Arrrr

+0

'AddTransient'는 (EF의 추적 메커니즘 때문에) 좋은 생각이 아닙니다. – Arrrr

+0

이 경우에는 객체의 수명이'AddDbContext'를 통해 제어되기 때문에 문제가되지 않습니다. 범위로 등록 할 때'provider => provider.GetRequiredService ()'는'services.AddScoped (provider => provider.GetRequiredService Tseng