c# - 更新依赖注入的单例
问题描述
我在运行时生成一个单例
public void ConfigureServices(IServiceCollection services)
{
var applications = Utils.generateApplications()
services.AddSingleton<ApplicationModel[]>(applications);
services.AddMvc();
}
我以后如何ApplicationModel[]
使用全新的ApplicationModel[]
. 我的应用程序中有一个功能,用户可以使用它来触发应用程序上的数据刷新,但是如何更新底层注入的 Singleton,以便所有未来的注入都使用更新后的应用程序?我有一个函数Utils.generateApplications()
可以获取最新的应用程序列表并返回一个ApplicationModel[]
. 如果有意义的话,如何用一个新对象覆盖旧注入的 Singleton 以注入到未来的调用中?
我有一些代码:
public void UpdateData()
{
var applications = Utils.generateApplications()
//How do I set applications to replace the injected singleton for all future injections?
}
解决方案
您应该使用额外的间接层。定义一个类似这样的接口:
interface IApplicationModelFactory
{
public ApplicationModel[] GetModel();
}
使用更新模型所需的方法(或方法)定义第二个接口:
interface IApplicationModelUpdate
{
void UpdateModel();
}
然后,您可以将ApplicationModel[]
注册从单个实例更改为作用域并委托给工厂:
var modelFactory = new ApplicationModelFactory();
services.AddSingleton<IApplicationModelFactory>(provider => modelFactory);
services.AddSingleton<IApplicationModelUpdate>(provider => modelFactory);
services.AddScoped<ApplicationModel[]>(provider => modelFactory.GetModel());
这样做的好处是每个请求都将获得模型的一致视图,即使它在处理该请求的过程中发生了变化。
推荐阅读
- c++ - 获取指向模板化 lambda 运算符 () 的指针,无需捕获
- rstudio - R笔记本全屏模式
- javascript - HowTo Google 登录 - 理解、安全 - 如何处理数据
- c++ - 在 C++ 模板函数中接收相同类型的可变参数大小的原始数组
- nuxt.js - 使用 nuxt.js 一次生成两个静态应用程序
- mysql - 查询(HAVING 子句)在 Mysql 版本 5.7 和 8.0 之间的行为不同
- amazon-cloudwatchlogs - 使用 cloudwatch 代理时如何解决“无效序列令牌”?
- keras - GridSearchCV、管道和功能模型
- python - 如何从 URL 中有日期的多个页面中提取数据?
- java - 如何在 natTable 中对配置标签进行排序?(有没有一种简单的方法可以从 nattable 中获取相对坐标?)