2011-01-21 66 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

謝謝聖雷莫。我們已經轉向爲我們的MVC應用程序請求作用域,並且它完美地工作..但是我們的WCF需要改變......我認爲它更多的與WCF配置有關,特別是instanceContextMode ......你能指點我一些很好的WCF ninject示例的方向? – littlechris 2011-01-27 09:00:39

相關問題