2010-02-25 11 views
1

J'essaie d'utiliser ninject avec db4o et j'ai un problème. Ceci est le code correspondant de la Global.aspxninject 2 et db4o

 static IObjectServer _server; 
    protected override void OnApplicationStarted() 
    { 
     AutoMapperConfiguration.Configure(); 
     RegisterRoutes(RouteTable.Routes); 
     RegisterAllControllersIn(Assembly.GetExecutingAssembly()); 
     if (_server == null) 
     { 
      // opening a server for a client/server session     
      IServerConfiguration serverConfiguration = Db4oClientServer.NewServerConfiguration(); 
      serverConfiguration.File.Storage = new MemoryStorage(); 
      _server = Db4oClientServer.OpenServer(serverConfiguration, "myServerDb.db4o", 0); 
     } 
    } 

    public static IObjectContainer OpenClient() 
    { 
     return _server.OpenClient(); 
    } 

    public MvcApplication() 
    { 
     this.EndRequest += MvcApplication_EndRequest; 
    } 

    private void MvcApplication_EndRequest(object sender, System.EventArgs e) 
    { 
     if (Context.Items.Contains(ServiceModule.SESSION_KEY)) 
     { 
      IObjectContainer Session = (IObjectContainer)Context.Items[ServiceModule.SESSION_KEY]; 
      Session.Close(); 
      Session.Dispose(); 
      Context.Items[ServiceModule.SESSION_KEY] = null; 
     } 
    } 

    protected override IKernel CreateKernel() 
    { 
     return new StandardKernel(new ServiceModule()); 
    } 

    public override void OnApplicationEnded() 
    { 
     _server.Close(); 
    } 

ce qui est le code dans ServiceModule

 internal const string SESSION_KEY = "Db4o.IObjectServer"; 

    public override void Load() 
    {    
     Bind<IObjectContainer>().ToMethod(x => GetRequestObjectContainer(x)).InRequestScope(); 
     Bind<ISession>().To<Db4oSession>(); 
    } 

    private IObjectContainer GetRequestObjectContainer(IContext Ctx) 
    { 
     IDictionary Dict = HttpContext.Current.Items; 
     IObjectContainer container; 
     if (!Dict.Contains(SESSION_KEY)) 
     { 
      container = MvcApplication.OpenClient(); 
      Dict.Add(SESSION_KEY, container); 
     } 
     else 
     { 
      container = (IObjectContainer)Dict[SESSION_KEY]; 
     } 
     return container; 
    } 

J'essaie ensuite de l'injecter dans ma session en tant que telle:

 public Db4oSession(IObjectContainer client) 
    { 

     db = client; 
    } 

Cependant, après le premier appel, le client est toujours fermé - comme il se doit à cause du code dans MvcApplication_EndRequest. Le problème est que le code dans GetRequestObjectContainer n'est jamais appelé qu'une seule fois. Qu'est-ce que je fais mal?

En outre, MvcApplication_EndRequest est toujours appelé 3 fois, est-ce normal?

Merci!

+1

'MvcApplication_EndRequest' est probablement appelé trois fois à cause d'une demande de' 'favicon.ico' et site.css 'lors de l'utilisation d'un modèle mvc2 par défaut? Regardez le chemin de la demande pour vous assurer. – mnemosyn

+0

vous avez complètement raison. Merci de répondre! – user10479

Répondre

2

Cela semble avoir fait le tour ... ajouter InRequestScope à l'autre injection:

Bind<ISession>().To<Db4oSession>().InRequestScope();