2010-03-14 3 views
5

내 웹 응용 프로그램 솔루션은 3 개 프로젝트 구성 나는 에 Entity Framework에 의해 생성 된 DataContext의 수명을 관리하기 위해 Ninject를 사용하고자합니다.Dependency Injection은 어느 정도까지 도달합니까?</p> <ol> <li>웹 응용 프로그램 (ASP.NET MVC)</li> <li>비즈니스 로직 계층 (클래스 라이브러리)</li> <li>데이터베이스 계층 (엔티티 프레임 워크)</li> </ol> <p>:

비즈니스 로직 계층은 리포지토리 (데이터베이스 계층에 위치)를 참조하는 클래스로 구성되며 ASP.NET MVC 응용 프로그램은 비즈니스 로직 계층의 서비스 클래스를 참조하여 코드를 실행합니다. 각 저장소는 웹에서 긴 의존성 체인에도 불구하고 MyDataContext의 수명을 처리

public class BizLogicClass 
{ 
    private MyRepository repos; 
    public MyRepository 
    { 
      this.repos = new MyRepository(); 
    } 

    // do stuff with the repos 
} 

윌 Ninject에

public class MyRepository 
{ 
    private MyDataContext db; 
    public MyRepository 
    { 
     this.db = new MyDataContext(); 
    } 

    // methods 
} 

비즈니스 로직 클래스

엔티티 프레임 워크

저장소에서 MyDataContext 객체의 인스턴스를 생성 데이터 영역에 앱?

답변

3

편집

나는 몇 시간 전에 그것은 몇 가지 문제를 가지고 있지만 지금은 작동하는 것 같다 : 당신이 OnePerRequestBehavior를 사용하고 돌볼 것입니다,

Bind<CamelTrapEntities>().To<CamelTrapEntities>().Using<OnePerRequestBehavior>(); 

을 대신 HttpModule의를 사용하는 현재 요청에서 컨텍스트를 처리합니다.

EDIT 너무 HttpModule의에 의존하기 때문에, Web.config를 등록해야 OnePerRequestBehavior 2

:

IIS6에서

: IIS7 함께

<system.web> 
    <httpModules> 
    <add name="OnePerRequestModule" type="Ninject.Core.Behavior.OnePerRequestModule, Ninject.Core"/> 
    </httpModules> 
</system.web> 

:

<system.webServer> 
    <modules> 
    <add name="OnePerRequestModule" type="Ninject.Core.Behavior.OnePerRequestModule, Ninject.Core"/> 
    </modules> 
</system.webServer> 

이전 답변

필요없는 상황을 처분하는 것은 귀하의 책임입니다. ASP.NET에서 가장 많이 사용되는 방법은 요청 당 하나의 ObjectContext를 갖는 것입니다. 내가 가진 HttpModule의 그것을 할 :

public Repository(CamelTrapEntities ctx) 
{ 
    _ctx = ctx; 
} 
+0

의미? – jfar

+0

@jfar : 잠시 전에 확인하고 kernel.Get <>을 두 번 호출하면 요청시 동일한 인스턴스가 두 번 제공됩니다. 이전에는 문제가 무엇인지 정확히 기억하지 못했습니다.하지만 어떻게 든 사용하지 않기로 결정했습니다. 그동안 새 소스를 다운로드했지만 오늘까지는 확인하지 않았으므로 적절하게 수정되었습니다. – LukLed

3

그냥 Autofac with the ASP.Net integration 요청 수명을 언급 할 :

Bind<CamelTrapEntities>().ToMethod(c => (CamelTrapEntities) HttpContext.Current.Items[@"CamelTrapEntities"]); 

내 저장소가 생성자에서 ObjectContext는 소요 :이 사출 규칙은

public class CamelTrapEntitiesHttpModule : IHttpModule 
{ 
    public void Init(HttpApplication application) 
    { 
     application.BeginRequest += ApplicationBeginRequest; 
     application.EndRequest += ApplicationEndRequest; 
    } 

    private void ApplicationEndRequest(object sender, EventArgs e) 
    { 
     ((CamelTrapEntities) HttpContext.Current.Items[@"CamelTrapEntities"]).Dispose(); 
    } 

    private static void ApplicationBeginRequest(Object source, EventArgs e) 
    { 
     HttpContext.Current.Items[@"CamelTrapEntities"] = new CamelTrapEntities();    
    } 
} 

입니다 지원 내장.RequestContainer에있는 인스턴스를 해결하면 요청이 끝날 때 처리됩니다 (IDisposable을 구현하는 경우).

당신은 당신의 클래스 DI하지만 친절해야한다 :

"작동하는 것 같다"무엇
public class MyRepository 
{ 
    private MyDataContext db; 
    public MyRepository(MyDataContext context) 
    { 
     this.db = context; 
    } 

    // methods 
} 

public class BizLogicClass 
{ 
    private MyRepository repos; 
    public BizLogicClass(MyRepository repository) 
    { 
      this.repos = repository; 
    } 

    // do stuff with the repos 
}