이전에는 비교적 쉽게 사용했던 것이 더 이상 필요하지 않습니다. 내가 수색 한 시간들 중에서, 나는이 상황에 대한 답을 거의 찾지 못한다. 나는이 상황을 대부분의 프로젝트 구조에서 널리 퍼진 것 외에는 아무것도 믿을 수 없다.동일한 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를 생성하고 시작시이를 등록해야합니까?
그냥'DatabaseService'을 등록하고 컨트롤러에 그 주사에 의존하는 컨트롤러를 리팩토링. 프레임 워크는 서비스의 해상도를 처리 할 것입니다 – Nkosi
당신의'DatabaseService'는 리포지터리와 똑같아 보입니다 .... 당신은 이미 그것을 알아 냈습니다 –