2012-04-19 6 views
2

InMemoryDataContextMyApplicationDataContext으로 구현 된 IDataContext 인터페이스가 있습니다. 이것은 BananaRepository : IBananaRepository로 정의하고 자신의 생성자에서 데이터 컨텍스트를 가지고 있습니다 내 저장소 모두에 의해 소비된다 Ninject와 함께 깊이가 1보다 큰 컨텍스트/조건부 종속성 주입?

interface IDataContext {} 
class InMemoryDataContext : IDataContext {} 
class MyApplicationDataContext : IDataContext {} 

interface IBananaRepository {} 
class BananaRepository : IBananaRepository 
{ 
    public BananaRepository(IDataContext dataContext) {} 
} 

지금까지 인터페이스와 서비스를 내 소비자 ASP.NET MVC 컨트롤러, 동기 명령 및 쿼리입니다. NInject가 내 웹 프로젝트에서 구성되고 IDataContextMyApplicationDataContextInRequestScope()으로 바인딩됩니다. 내가 비동기 처리 (명령, 이벤트 + 처리기 등)를 추가 시작할 위치

kernel.Bind<IDataContext>().To<MyApplicationDataContext>().InRequestScope(); 
kernel.Bind<IBananaRepository>().To<BananaRepository>(); 

나는 내 프로젝트의 진화 지점에 도달했습니다. 내가 직면하고있는 문제는 과도 응답을 얻기 위해서 (즉, 매번 새로운) IDataContext을 필요로하지만, 바인딩은 이미 컨트롤러에 대한 요청마다 IDataContext 인스턴스로 설정되어있다. 으로 초기화 할 수 Ninject에이 클래스 IAsyncCommandIBananaRepository의 구현 (내 모든 다른 저장소를) 인스턴스화 할 때 내가 원하는

class DoSomethingAsyncCommand : IAsyncCommand<TArgs> 
{ 
    public DoSomethingAsyncCommand(IBananaRepository repository) {} 

    public bool Execute(TArgs args) {} 
} 

:

DoSomethingAsyncCommand는 새로운 스레드에서 실행됩니다이 간단한 시나리오를 고려 IDataContext보다는 웹 요청에 대한 하나의 새로운 인스턴스 (효과적으로 내가 InTransientScope()으로 준수 할 IAsyncCommandIDataContext 원하는) 재사용 할 수

내가 어떻게 할 수 있습니까?

P.S : IinyncCommand 인스턴스를 직접 인스턴스화하기 위해 Ninject 커널이 아닌 CommonServiceLocator를 사용하고 있습니다. https://github.com/ninject/ninject/blob/master/src/Ninject/Planning/Bindings/BindingConfigurationBuilder.cs

에서

+0

단순한 "kernel.Bind (). (). WhenInjectedInto (). InTransientScope();" 바인딩합니까? – Hari

+0

@Hari 아니요, 컨텍스트가 명령에없는 저장소에 삽입 되었기 때문입니다. –

답변

2

봐가 당신은 IsAnyAnchestorNamed을 찾을 수 있습니다. 같은 루프를 사용하여 WhenInjectedInto에서 찾은 조건과 결합하고 custom When에서 호출 할 수 있습니다.

+0

고마워요 - 오늘 나중에 이것을 구현하는 방법을 살펴보고 다시 묻습니다 (그리고이 질문/답변). –

+0

흠. 그래서이 작업을하고'DoSomethingAsyncCommand (IRepo1 repo1, IRepo2 repo2)'를 호출하고'TransientScope'를 사용하면 실제로 두 개의 IDataContext 인스턴스를 생성하게됩니다. 어떻게해야합니까? –

+0

데이터 컨텍스트가 인스턴스화 될 때 저장소 나 범위 개체로 사용할 명령에 대한 참조가 없기 때문에 나만 또는 내가 생각한 바가 가능하지 않을까요? 내 시나리오에서 공장을 사용하는 것이 나을 것 같습니까? –