Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc Castle项目-刷新Castle Windsor singleton的选项(过期?通知?)_Asp.net Mvc_Singleton_Castle Windsor - Fatal编程技术网

Asp.net mvc Castle项目-刷新Castle Windsor singleton的选项(过期?通知?)

Asp.net mvc Castle项目-刷新Castle Windsor singleton的选项(过期?通知?),asp.net-mvc,singleton,castle-windsor,Asp.net Mvc,Singleton,Castle Windsor,我在ASP.NET MVC 2项目中使用Castle Windsor 2.0进行依赖项注入 我的一个组件保存应用程序配置数据,当前配置为单例(目的是避免频繁访问数据库中不经常更改的值) 我刚刚创建了一个管理站点来更改配置。原始应用程序将保留配置值,直到应用程序池重新启动(这并不奇怪)。用户希望能够及时应用其更改 可能的解决方案: 减少应用程序池的生存期 如果站点管理员希望立即进行更改,请让他们回收应用程序池 切换到另一个DI容器 使用一个网站做任何事情 将singleton更改为PerWeb

我在ASP.NET MVC 2项目中使用Castle Windsor 2.0进行依赖项注入

我的一个组件保存应用程序配置数据,当前配置为单例(目的是避免频繁访问数据库中不经常更改的值)


我刚刚创建了一个管理站点来更改配置。原始应用程序将保留配置值,直到应用程序池重新启动(这并不奇怪)。用户希望能够及时应用其更改

可能的解决方案:

  • 减少应用程序池的生存期
  • 如果站点管理员希望立即进行更改,请让他们回收应用程序池
  • 切换到另一个DI容器
  • 使用一个网站做任何事情
  • 将singleton更改为PerWebRequest
  • 创建一种机制,允许管理接口通知应用程序并刷新单例
  • 使单例在设定的时间后过期,从而强制刷新
  • 我认为选项7(单例过期)将是理想的,但在查看之后,似乎还没有可用的过期功能。这似乎是一个可能的解决方案,但我不知道如何实现它


    有人对如何实施方案6或7有什么建议吗?也许还有另一种解决方案?

    你能在一个文件上创建一个依赖项吗?比如web.config,但还有其他一些东西,当文件更改时,它会告诉单例程序重新加载自己吗

    我正在使用AutoFac for DI做一些类似的事情,但在我的例子中,我正在使用内存存储库来处理一些很少更改的小型常用实体集合。当它们通过Maintenace网站进行更改时,我会触摸一个文件,该文件强制弹出一个缓存条目,使所有缓存项过期,从而强制重新加载


    我不确定这在Castle中意味着什么,因为我的解决方案也与Autofac无关。但是,也许您的配置对象可以存在于asp.net缓存中,并以相同的方式过期,而不是像城堡中的一个单体一样?Castle返回一个对象,该对象将数据加载到singleton中,并在必要时缓存它(使用文件依赖项)。

    只要在singleton上调用一个方法,即可在发生更改时重新加载设置。或者在singleton内部有一个计时器来刷新它。

    我在Castle中使用singleton实现了类似的功能。我的singleton使用FileSystemWatcher监视更改事件,然后在文件更改时将数据重新加载到singleton中的dictionary对象中。此文件包含相当静态的引用数据


    当然,在Singleton中重新加载数据时,需要处理并发性问题

    我想告诉大家,Ninject有一种重新绑定的方法,在这种情况下效果非常好。从Castle切换到Ninject相对来说没有痛苦

    void MvcApplication_BeginRequest(object sender, EventArgs e)
    {
      if (/* criteria to refresh singleton */)
        this.Kernel.Rebind<IMySingleton>().To<MySingleton>().InSingletonScope();
    }
    
    void mvcapapplication\u BeginRequest(对象发送方,事件参数e)
    {
    如果(/*刷新单例的条件*/)
    this.Kernel.Rebind().To().InSingletonScope();
    }
    
    类似于@mark909,但我会使用一个文件系统监视程序,而不是需要文件的文件系统监视程序

    Web项目(带单例) 我将使用互斥对象()扩展单例。在初始化单例时,我将创建一个新线程(使用or)来阻止方法调用。当互斥体收到信号时,线程将继续,您可以重新加载配置。不要忘记通过调用来释放互斥锁

    行政网站
    将互斥体引用添加到此应用程序,并且每当进行了应导致重新加载configuraten数据的更改时,使用释放互斥体。这将导致Web项目(即Singleton)收到信号并重新加载。别忘了用它来控制互斥。因为这是一个阻塞函数,它是一个网站,你可能需要考虑。使用较小的时间跨度,您可以通知管理网站的用户Web项目仍在忙于加载配置。

    “singleton expiration”是一个矛盾的说法。@Mauricio:您是对的-我可能在PerWebRequest和singleton之间寻找一些东西。我没有收到您的答复(因此回复很晚)但有趣的是,这是我决定走的路线。唯一令人困惑的是我是如何让singleton检查计时器的——我将检查绑定到getter中,以获得一个公共属性。关于检查计时器的优雅方法有什么建议吗?我总是使用反应式扩展:
    Observable.Interval(TimeSpan.FromHours(1)).Subscribe(I=>Refresh())
    
    void MvcApplication_BeginRequest(object sender, EventArgs e)
    {
      if (/* criteria to refresh singleton */)
        this.Kernel.Rebind<IMySingleton>().To<MySingleton>().InSingletonScope();
    }