2010-02-25 6 views
1

Я пытаюсь использовать ninject с db4o, и у меня есть проблема. Это соответствующий код из 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

+0

ты совершенно прав. Спасибо за ответ! – user10479

ответ

2

Это, кажется, сделал трюк ... добавить InRequestScope к другой инъекции:

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