2011-01-21 3 views
2

ASP.NET MVC 응용 프로그램에서 NInject를 사용하고 있으며 내 객체 컨텍스트를 만들 때 싱글 톤이 어떻게 작동하는지 100 % 확신하지 못합니다.Ninject Singletons - 응용 프로그램 또는 세션 수준에서 생성됩니까?

내 질문은 :

는 사용자 세션 당 하나의 ObjectContext는있을 것입니다 아래의 코드를 사용하거나 전체 응용 프로그램에 대한 공유 하나가 될 것인가? 각 사용자 은 한 번에 하나의 컨텍스트 ( )를 갖기를 원하지만 각 사용자는 고유 한 인스턴스를 가져야합니다.

InRequestScope() 제가 고려해야 할 사항은 무엇입니까?

또한 WCF 서비스에서도 동일한 작업을 수행하며 그 답은 모두 동일하다고 가정합니다.

내에서 Global.asax는 :

public class MvcApplication : NinjectHttpApplication 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new { controller = "Change", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
     ); 
    } 

    protected override void OnApplicationStarted() 
    { 
     // Ninject Code 
     base.OnApplicationStarted(); 
     AreaRegistration.RegisterAllAreas(); 
     RegisterRoutes(RouteTable.Routes); 
    } 

    protected override IKernel CreateKernel() 
    { 
     var modules = new INinjectModule[] { new ContextModule() }; 
     return new StandardKernel(modules); 
    } 

    public class ContextModule : NinjectModule 
    { 
     public override void Load() 
     { 
      Bind<ObjectContext>().To<ChangeRoutingEntities>().InSingletonScope(); 
      Bind<IObjectContext>().To<ObjectContextAdapter>(); 
      Bind<IUnitOfWork>().To<UnitOfWork>(); 
     } 
    } 
} 

답변

2

ISingletonScope은 응용 범위가 광범위하다. InRequestScope는 현재 요청에 대해서만 사용됩니다.

세션 범위가 필요합니다. 이 유형의 범위를 구현하는 방법은 http://iridescence.no/post/Session-Scoped-Bindings-With-Ninject-2.aspx을 참조하십시오.

public static class NinjectSessionScopingExtention 
{ 
    public static void InSessionScope<T>(this IBindingInSyntax<T> parent) 
    { 
     parent.InScope(SessionScopeCallback); 
    } 

    private const string _sessionKey = "Ninject Session Scope Sync Root"; 
    private static object SessionScopeCallback(IContext context) 
    { 
     if (HttpContext.Current.Session[_sessionKey] == null) 
     { 
      HttpContext.Current.Session[_sessionKey] = new object(); 
     } 

     return HttpContext.Current.Session[_sessionKey]; 
    } 
} 
+0

감사합니다. Remo. 우리는 MVC 응용 프로그램의 범위를 요청하여 이동했지만 완벽하게 작동합니다 .. 그러나 WCF를 변경해야합니다 ... WCF 구성, 특히 instanceContextMode와 더 관련이 있다고 생각합니다. 좋은 WCF 예제의 방향? – littlechris

관련 문제