9
내 MVC 3 응용 프로그램에서 내가 Ninject에 사용하고

내 종속성 중 하나는 엔티티 프레임 워크에 :Ninject + ASP.net MVC + Entity Framework - 컨텍스트가 언제 폐기됩니까?

interface IFooRepository 
{ 
    Foo GetFoo(int id); 
} 

public EFFooRepository : IFooRepository 
{ 
    private FooDbContext context; 

    public EFFooRepository(FooDbContext context) 
    { 
     this.context = context; 
    } 
} 

가 나는 그렇게해서 Ninject처럼 바인딩을 설정, 그래서 모두 필요 이상의 종속성이하고있는 경우 그들은 같은 컨텍스트를 공유하고 결국 데이터 컨텍스트 :

Bind<FooDbContext>().ToSelf().InRequestScope(); 

내 컨텍스트가 배치 될 때의 불확실입니다. 나는 그것을 인스턴스화하는 사람이 아니기 때문에 쓰레기 수거를 할 때 처분 될 것인가, 아니면 그냥 처분 될 것인가? Ninject는 작업이 끝나면 아무 것도 처분 할 수 있습니까?

답변

11

FooDbContextIDisposable을 구현하는 경우 Ninject는 요청 끝에 자동으로 Dispose 메서드를 호출합니다. 여기

당신이 그것을 확인하는 방법은 다음과 같습니다

public interface IFooRepository 
{ 
} 

public class FooDbContext: IDisposable 
{ 
    public void Dispose() 
    { 
     throw new NotImplementedException(); 
    } 
} 

public class EFFooRepository : IFooRepository 
{ 
    private FooDbContext _context; 

    public EFFooRepository(FooDbContext context) 
    { 
     _context = context; 
    } 
} 

public class HomeController : Controller 
{ 
    private readonly IFooRepository _repo; 

    public HomeController(IFooRepository repo) 
    { 
     _repo = repo; 
    } 

    public ActionResult Index() 
    { 
     return View(); 
    } 
} 
:

  1. 설치 다음
  2. 이 가지고있는 Ninject.Mvc3 NuGet 패키지를 기본 템플릿

  3. 을 사용하여 새 ASP.NET MVC 3 응용 프로그램을 만듭니다
  4. RegisterServices 방법에 다음을 추가하십시오.:

    private static void RegisterServices(IKernel kernel) 
    { 
        kernel.Bind<FooDbContext>().ToSelf().InRequestScope(); 
        kernel.Bind<IFooRepository>().To<EFFooRepository>(); 
    } 
    
  5. 응용 프로그램을 실행하십시오. 요청이 끝날 때 예상대로 FooDbContext 인스턴스가 삭제되고 NotImplementedException 예외가 발생합니다.

+0

그게 내가 원하는 것입니다. 나는 DbContext가 IDisposable을 구현한다고 생각한다. 사실 그렇지 않다면 나는 충격을받을 것입니다. 감사! – Dismissile

+2

@Dismissile, 예, DbContext는 IDisposable을 구현합니다. –

+0

오, 아주 좋아. 예제를 가져 주셔서 감사합니다. – Dismissile

관련 문제