2013-12-10 3 views
0

InRequestScope로 설정된 바인딩을 사용하여 Ninject를 사용하도록 변환 한 기존 웹 프로젝트가 있습니다.3 단계 Ninject Console App

// binding in AppStart 
kernel.Bind<IDbContext>().To<DbContext>().InRequestScope(); 

... 

// business layer 
public class BusinessService { 
    public BusinessService(IDbContext context) { 
     this.Context = context; 
    } 

    private IDbContext Context { get; set; } 

    public void UpdateUser(int userId) { 
     User user = this.Context.Users.Single(u => u.UserId == userId); 
     user.LastUpdated = DateTime.Now; 
     this.Context.SaveChanges(); 
    } 
} 

이제 비즈니스 계층의 코드를 사용하는 몇 가지 콘솔 앱을 변환하려고합니다.

// ... Console App ... 
foreach(int userId in usersNeedingToBeUpdated) { 
    // do stuff to each user 
    BusinessService businessService = kernel.Get<BusinessService>(); 
    businessLayer.UpdateUser(userId); 
} 

그러나 범위를 이해하는 데 문제가 있습니다. 나는 kernel.Get()을 할 때마다 Ninject가 새로운 IDbContext를주고 이전 IDbContext를 처리하도록하고 싶다. 나는

kernel.Bind<IDbContext>().To<DbContext>().InParentScope(); 

을하고 노력 그리고 사람이 직접 IDbContext를 요청할 때까지이 작동 : 부모 범위 없기 때문에

kernel.Get<IDbContext>(); 

가 그럼 난 널 포인터 예외를 얻을. 대신 TransientScope를 사용하면 Ninject는 IDbContext를 처리하지 않습니다. 1. 어떻게하면 모든 커널에서 얻을 수 있을까요? <>() 새로운 서비스와 새로운 의존성을 얻었고 이전 종속성이 삭제 되었습니까?

나는 this post을 읽었지만 아직해야할 일이 확실하지 않습니다.

+0

참조 [여기] (http://stackoverflow.com/questions/18655915/ninject-dbcontext-windows-service-new- 참조 '.InScope()'

와 범위를 소유하고 구현할 수 'InRequestScope'가 어떻게 작동하는지에 대한 설명은 // instance-each-time-thread-runs/18656636 # 18656636을 참조하십시오). – qujck

답변

1

, 당신은

kernel.Get<IDbContext>(); 

을 할 경우 (사전 정의)이 사용 가능한 경우에만 스코프는 다음과 같습니다

  • .InSingletonScope()
  • .InTransientScope()
  • .InThreadScope()
  • .InCallScope()

왜? 다른 사람들은 존재하는 상황에 의존합니다. '.InParentScope() 예를 들어 "IDbContext이 (- 또는 재산 주입 생성자) -에 주입 객체를 찾습니다.. 당신이 kernel.Get<...>을 한 이후, 그러나 아무도 없다 실패 그래서

을 범위의 대부분은 어떤 kernel.Get<>와 함께 사용하면 도움이되지 않습니다. 콘솔 응용 프로그램 수명주기가 IDbContextIDbContext 중 하나와 밀접하게 결합되어 콘솔 응용 프로그램의 여러 개체에 사용 된 경우 .InSingletonScope()을 사용하는 것이 좋습니다. '.InSingletonScope()'을 사용하면 객체가 첫 번째 요청시 객체를 초기화하고 커널을 폐기/종료 할 때 객체를 폐기합니다. 그러나 '.InSingletonScope()'은 웹 프로젝트에 적합하지 않습니다.

그래서 기본적으로 두 개의 서로 다른 바인딩이 필요합니다 웹 응용 프로그램

  • Bind<IDbContext>().To<DbContext>().InRequestScope();
  • Bind<IDbContext>().To<DbContext>(); 경우 콘솔 응용 프로그램 해킹으로

에 대한 (기본 과도 범위), 당신 별도의 바인딩을 정의하고 싶지 않은 경우도 할 수 있습니다.

0 콘솔 응용 프로그램에서

다른 많은 가능성이 있지만 사용 사례/구현에 크게 의존합니다. 당신은 당신이 또한 https://github.com/ninject/ninject/wiki/Object-Scopes

0

DbContext 인스턴스를 만든 후에 저장하는 것처럼 보이므로 범위를 모두 무시할 수 있어야합니다. InTransientScope()이 기본값이기 때문에 기본적으로 Ninject는 범위가 정의되지 않은 경우 새 인스턴스를 반환합니다.

https://github.com/ninject/ninject/wiki/Object-Scopes

당신은 또한 당신이 원하는 경우 특정 인스턴스를 반환에 자신의 메커니즘을 구현할 수 있습니다. 위에 제공된 링크에서 그렇게하기위한 지시 사항이 있습니다.

잘 읽었다면 잘 읽었을 것입니다. 콘솔 응용 프로그램에 대한