DataBase
파생 컨트롤러가 액세스 할 수 있는 속성을 노출하는 기본 컨트롤러를 사용합니다 .
public abstract class BaseController : Controller
{
public BaseController()
{
Database = new DatabaseContext();
}
protected DatabaseContext Database { get; set; }
protected override void Dispose(bool disposing)
{
Database.Dispose();
base.Dispose(disposing);
}
}
내 응용 프로그램의 모든 컨트롤러는 다음에서 파생되며 다음 BaseController
과 같이 사용됩니다.
public class UserController : BaseController
{
[HttpGet]
public ActionResult Index()
{
return View(Database.Users.OrderBy(p => p.Name).ToList());
}
}
이제 질문에 답하십시오.
새 DbContext를 언제 만들어야하나요? / 내가 전달하는 하나의 전역 컨텍스트가 있어야하나요?
컨텍스트는 요청별로 생성되어야합니다. 컨텍스트를 만들고 필요한 작업을 수행 한 다음 제거하십시오. 기본 클래스 솔루션을 사용하면 컨텍스트 사용에 대해서만 걱정하면됩니다.
글로벌 컨텍스트를 시도하지 마십시오 (웹 애플리케이션의 작동 방식이 아님).
모든 위치에서 재사용 할 수있는 하나의 글로벌 컨텍스트를 가질 수 있습니까?
아니요, 컨텍스트를 유지하면 모든 업데이트, 추가, 삭제 등을 추적 할 수 있으며 이로 인해 애플리케이션 속도가 느려지고 애플리케이션에 매우 미묘한 버그가 나타날 수도 있습니다.
저장소 또는 컨텍스트를 컨트롤러에 노출하도록 선택해야 하지만 둘다는 아닙니다. 동일한 메서드에서 두 개의 컨텍스트에 액세스하면 둘 다 애플리케이션의 현재 상태에 대해 서로 다른 아이디어를 가지고있는 경우 버그가 발생합니다.
개인적으로 나는 내가 DbContext
본 대부분의 저장소 예제가 DbContext
어쨌든 얇은 래퍼로 끝날 때 직접 노출하는 것을 선호 합니다.
이로 인해 성능 저하가 발생합니까?
a를 처음 DbContext
만들 때는 비용이 많이 들지만 일단 이렇게되면 많은 정보가 캐시되어 후속 인스턴스화가 훨씬 빨라집니다. 데이터베이스에 액세스해야 할 때마다 인스턴스화하는 것보다 컨텍스트를 유지함으로써 성능 문제를 볼 가능성이 더 큽니다.
다른 사람들은 어떻게 이것을하고 있습니까?
때에 따라 다르지.
어떤 사람들은 생성 될 때 자신의 컨텍스트의 구체적인 인스턴스를 컨트롤러에 전달하기 위해 종속성 주입 프레임 워크를 사용하는 것을 선호합니다. 두 옵션 모두 괜찮습니다. Mine은 사용중인 특정 데이터베이스가 변경되지 않을 것이라는 것을 알고있는 소규모 애플리케이션에 더 적합합니다.
어떤 사람들은 당신 이 이것을 알 수 없다고 주장 할 수 있으며 , 그것이 당신의 애플리케이션을 변화에 더 탄력적으로 만들어주기 때문에 의존성 주입 방법이 더 나은 이유입니다. 이에 대한 내 의견은 아마도 변경되지 않을 것이며 (SQL 서버 및 Entity Framework는 거의 모호하지 않음) 내 응용 프로그램에 맞는 코드를 작성하는 데 시간을 보내는 것이 가장 좋습니다.