InMemoryDataContext
및 MyApplicationDataContext
으로 구현 된 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가 내 웹 프로젝트에서 구성되고
IDataContext
은
MyApplicationDataContext
과
InRequestScope()
으로 바인딩됩니다. 내가 비동기 처리 (명령, 이벤트 + 처리기 등)를 추가 시작할 위치
kernel.Bind<IDataContext>().To<MyApplicationDataContext>().InRequestScope();
kernel.Bind<IBananaRepository>().To<BananaRepository>();
나는 내 프로젝트의 진화 지점에 도달했습니다. 내가 직면하고있는 문제는 과도 응답을 얻기 위해서 (즉, 매번 새로운) IDataContext
을 필요로하지만, 바인딩은 이미 컨트롤러에 대한 요청마다 IDataContext
인스턴스로 설정되어있다. 으로 초기화 할 수 Ninject에이 클래스 IAsyncCommand
IBananaRepository
의 구현 (내 모든 다른 저장소를) 인스턴스화 할 때 내가 원하는
class DoSomethingAsyncCommand : IAsyncCommand<TArgs>
{
public DoSomethingAsyncCommand(IBananaRepository repository) {}
public bool Execute(TArgs args) {}
}
:
내DoSomethingAsyncCommand
는 새로운 스레드에서 실행됩니다이 간단한 시나리오를 고려
IDataContext
보다는 웹 요청에 대한 하나의 새로운 인스턴스 (효과적으로 내가
InTransientScope()
으로 준수 할
IAsyncCommand
내
IDataContext
원하는) 재사용 할 수
내가 어떻게 할 수 있습니까?
P.S : IinyncCommand 인스턴스를 직접 인스턴스화하기 위해 Ninject 커널이 아닌 CommonServiceLocator를 사용하고 있습니다. https://github.com/ninject/ninject/blob/master/src/Ninject/Planning/Bindings/BindingConfigurationBuilder.cs
에서
단순한 "kernel.Bind(). (). WhenInjectedInto (). InTransientScope();" 바인딩합니까? –
Hari
@Hari 아니요, 컨텍스트가 명령에없는 저장소에 삽입 되었기 때문입니다. –