Asp.net mvc Castle项目-刷新Castle Windsor singleton的选项(过期?通知?)
我在ASP.NET MVC 2项目中使用Castle Windsor 2.0进行依赖项注入 我的一个组件保存应用程序配置数据,当前配置为单例(目的是避免频繁访问数据库中不经常更改的值)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
我刚刚创建了一个管理站点来更改配置。原始应用程序将保留配置值,直到应用程序池重新启动(这并不奇怪)。用户希望能够及时应用其更改
可能的解决方案:
有人对如何实施方案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();
}