2010-02-25 75 views
1

我想用db4o使用ninject,我有一个问题。这是从Global.aspxninject 2和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(); 
    } 

相关的代码,这是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; 
    } 

然后我尝试将其注入到我的会议这样:

 public Db4oSession(IObjectContainer client) 
    { 

     db = client; 
    } 

但是,在第一次调用之后,客户端始终是关闭的 - 因为它应该是因为MvcApplication_EndRequest中的代码。问题在于GetRequestObjectContainer中的代码只被调用过一次。我究竟做错了什么?

此外,MvcApplication_EndRequest总是被调用3次,这是正常的吗?

谢谢!

+1

'MvcApplication_EndRequest'可能是因为所谓的请求的三次'favicon.ico'和'的site.css '使用默认的mvc2模板时?查看请求路径以确保。 – mnemosyn 2010-02-27 17:20:11

+0

你完全正确。谢谢回答! – user10479 2010-02-28 00:04:01

回答

2

这似乎做的伎俩......添加InRequestScope其​​他注射:

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