1

이전에는 비교적 쉽게 사용했던 것이 더 이상 필요하지 않습니다. 내가 수색 한 시간들 중에서, 나는이 상황에 대한 답을 거의 찾지 못한다. 나는이 상황을 대부분의 프로젝트 구조에서 널리 퍼진 것 외에는 아무것도 믿을 수 없다.동일한 Asp.Net Core 2 솔루션의 클래스 라이브러리 프로젝트에 DbContext 삽입

나는 표준 Core 2.0 웹 응용 프로그램을 갖고 있으며, 현재는 인프라 프로젝트와 단위 테스트 프로젝트를 간략하게하기 위해있다. 테스트 프로젝트가 asp.net을 실행하지 않기 때문에 테스트 시나리오를 수행하는 방법을 잘 알고 있고이를 수행하는 방법에 대한 훌륭한 비디오 자습서가 있습니다.

내 인프라 프로젝트에서 DbContext에 액세스하는 데 문제가 있습니다. (닷넷 코어 클래스 라이브러리)

DbContext 예

var connString = Configuration.GetSection("ApplicationConfiguration:ConnectionStrings:DefaultConnection").Value; 
     services.AddDbContext<ApplicationDbContext>(options => 
      options.UseSqlServer(connString)); 

그리고 컨트롤러에 내가 그것을

private ApplicationDbContext _context; 
private IConfiguration Configuration { get; set; } 

public HomeController(IConfiguration configuration, ApplicationDbContext context) 
{ 
    _context = context; 
    Configuration = configuration; 
} 

public IActionResult Index() 
{ 
    // gets users from the DI injected context in the controller 
    var users = _context.AppUsers.ToList(); 

    // if GetUsers is defined statically, this doesn't work because the injected context is always null 
    //var diUsers = DatabaseService.GetUsers(): 

    // making it non-static and newing it up works, but defeats the purpose because you are passing the context, asp.net is not injecting it 
    var ds = new DatabaseService(_context); 
    var diUsers = ds.GetUsers(); 

    var svm = SettingsViewModel(); 

    return View(svm); 
} 

DatabaseService

private ApplicationDbContext _context; 
//this is the constructor for DatabaseService class 
public DatabaseService(ApplicationDbContext context) 
{ 
    _context = context; 
} 

public List<ApplicationUser> GetUsers() 
{ 
    var users = _context.AppUsers.ToList(); 
    return users; 
} 

에 액세스 할 수 있습니다 시작

에서 완벽하게 정상적으로 설정 , 내가 저장소를 사용해야한다는 것을 알았고이 계산 결과를 올바르게 얻게 될 것입니다. Infrastructure 프로젝트에서 클래스를 설정하여 시작시 생성 된 DbContext를 매개 변수로 전달하지 않아도됩니다.

부록 : 코시가 제공하는 답을 사용

, 나는 컨트롤러에서 데이터 서비스를 주입하고 사용할 수 있습니다.

하지만 내 저장소 및 UOW를 구현하는 별도의 인프라 프로젝트 (Asp.net 코어 2 클래스 라이브러리),

public class GenericRepository<T> : IRepository<T> where T : class 
{ 
    public GenericRepository() 
    { 

    } 
    //rest of code removed 
} 

가 어떻게이 DbContext가 주입 얻을 수있는 경우에? DbContext를 감싸기 위해 Interface, IDbContext를 생성하고 시작시이를 등록해야합니까?

+0

그냥'DatabaseService'을 등록하고 컨트롤러에 그 주사에 의존하는 컨트롤러를 리팩토링. 프레임 워크는 서비스의 해상도를 처리 할 것입니다 – Nkosi

+0

당신의'DatabaseService'는 리포지터리와 똑같아 보입니다 .... 당신은 이미 그것을 알아 냈습니다 –

답변

1

당신은 당신의 서비스

public interface IDatabaseService { 
    List<ApplicationUser> GetUsers(); 
    //... 
} 

public class DatabaseService : IDatabaseService { 

    public DatabaseService(ApplicationDbContext context) { 
     //...code removed for brevity 
    } 

    //...code removed for brevity 
} 

서비스는 명시 적으로 구현이 서비스 컨테이너에서 해결 될 때 주입 될 것입니다되는 ApplicationDbContext에 따라 달라집니다에 대해 다음 한 가정.

Startup.ConfigureServices

var connString = Configuration.GetSection("ApplicationConfiguration:ConnectionStrings:DefaultConnection").Value; 
services.AddDbContext<ApplicationDbContext>(options => 
     options.UseSqlServer(connString)); 
services.AddScoped<IDatabaseService, DatabaseService>(); 

에 서비스를 등록하고 명시 적으로 서비스

private IDatabaseService ds; 
private IConfiguration Configuration { get; set; } 

public HomeController(IConfiguration configuration, IDatabaseService ds) { 
    this.ds = ds; 
    Configuration = configuration; 
} 

public IActionResult Index() { 
    var diUsers = ds.GetUsers(); 

    var svm = SettingsViewModel(); 

    return View(svm); 
} 
+0

@ Nkosi ... 나는 그렇게하는 법을 보았습니다. 그러나 실제로 그것을 주입하는 것에 대해 혼란스러워했습니다. DbContext. 그걸 정리 해줘서 고마워. 이제는 또 다른 클래스 라이브러리 프로젝트를 만들면 DatabaseService도 사용할 수 있습니까? 거기에 DbContext를 어떻게 주입합니까?귀하의 대답은 주입 기능이 항상 웹 응용 프로그램에 연결되어있는 것 같습니다 – dinotom

+0

@dinotom이 경우 코드는 주로 View (웹 프로젝트)와 관련된 구현 관심사 인 'ApplicationDbContext'에 결합되지만, 다른 프로젝트에서 추상화를 사용하면 더 이상 중요하지 않습니다. 종속 클래스는 런타임에 실현/해결 될 추상화에 종속됩니다. – Nkosi

+0

@dinotom 코드를 DbContext에 너무 의존하지 말고 포장하는 서비스로 만들 것을 제안합니다. DbContext는 구현 관련 사항입니다. – Nkosi