2 и db4o - PullRequest
       17

2 и db4o

1 голос
/ 25 февраля 2010

Я пытаюсь использовать ninject с db4o, и у меня проблема. Это соответствующий код из Global.aspx

        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 Ответ

2 голосов
/ 25 февраля 2010

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

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