2012-07-12 5 views
1

타이머 작업에서 새 Ninject 컨텍스트를 호출하는 방법은 무엇입니까? ninject 범위를 unitofwork로 구성하는 데 어려움이 있습니다. InRequestScope()로 설정하면 비 요청 작업에서는 작동하지 않습니다. 내가 작업 InThreadScope를 얻을 수 있도록 그래서 아래와 같이 설정 :Ninject Scope 및 System.Threading.Timer

kernel.Bind<IUnitOfWork>().To<myEntities>().InScope(ctx => HttpContext.Current ?? StandardScopeCallbacks.Thread(ctx)); 

그러나 그런 식으로, 나는

Timer timer = new Timer(_ => DelayedDisconnect(chatUser.User.AuthorizationId), null, TimeSpan.FromSeconds(10), TimeSpan.FromMilliseconds(-1)); 

dbContext 새 데이터베이스 값으로 새로 고쳐지지 않는 타이머를 설정할 때 .

public void DelayedDisconnect(string authorizationId) 
    { 
     var myChatUser = GetChatUserByClaimedIdentifier(authorizationId); 

     if (!myChatUser.ChatClients.Any()) // old state (doesn't reflect database changes from 10 seconds ago). 

그래서 ... 현재 상태/db 값을 반영하여 새 Ninject "컨텍스트"를 호출하는 방법은 무엇입니까?

답변

1

정말 ASP.NET 응용 프로그램에서 백그라운드 작업을 실행하면 안됩니다. 이를 수행 할 서비스를 작성하십시오. http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx

Windows 서비스를 사용하면 정말 쉽습니다. 커널에서 모든 작업을 수행하는 SomeProcessor을 요청하는 타이머를 설정하십시오. 이제 NamedScope 확장을 사용하여 프로세서가 UoW와 같은 일부 객체의 범위라는 것을 정의 할 수 있습니다.

kernel.Bind<SomeProcessor>().ToSelf().DefinesNamedScope("Processor"); 
kernel.Bind<IUoW>().To<UoW>().InNamedScope("Processor"); 
+0

빠른 응답을 위해 Thanks Remo. 하지만이 경우 재발하는 독립적 인 작업이 아닙니다 ... 클라이언트가 브라우저 윈도우를 닫을 때 (웹 애플리케이션에서 SignalR을 사용하여) 웹 앱에서 호출되는 것은 실제로 지연된 단일 작업입니다. 여전히 Windows 서비스가 가장 좋을 것이라고 생각하십니까? 이 경우 웹 앱에서 서비스를 어떻게 호출합니까? –

+0

참조 http://stackoverflow.com/a/11772577/11635 –