gpt4 book ai didi

c# - 更新依赖注入(inject)的单例

转载 作者:行者123 更新时间:2023-12-03 23:14:45 24 4
gpt4 key购买 nike

我在运行时生成一个单例

public void ConfigureServices(IServiceCollection services)
{
var applications = Utils.generateApplications()
services.AddSingleton<ApplicationModel[]>(applications);
services.AddMvc();
}

我以后如何更新这个注入(inject)的依赖 ApplicationModel[]全新的 ApplicationModel[] .我的应用程序中有一个功能,用户可以使用它来触发应用程序上的数据刷新,但是如何更新底层注入(inject)的 Singleton,以便所有 future 的注入(inject)都使用更新后的应用程序?我有一个函数 Utils.generateApplications()获取最新的应用程序列表并返回 ApplicationModel[] .如果有意义的话,我如何用一个新对象覆盖旧注入(inject)的 Singleton 以注入(inject)到 future 的调用中?

我有一些代码:
public void UpdateData()
{
var applications = Utils.generateApplications()
//How do I set applications to replace the injected singleton for all future injections?
}

最佳答案

您应该使用额外的间接层。我认为最简单的方法是使用抽象工厂。定义一个类似这样的接口(interface):

interface IApplicationModelFactory
{
public ApplicationModel[] GetModel();
}
使用更新模型所需的方法(或方法)定义第二个接口(interface):
interface IApplicationModelUpdate
{
void UpdateModel();
}
然后您可以更改您的 ApplicationModel[]从单实例注册到作用域并委托(delegate)给工厂:
var modelFactory = new ApplicationModelFactory();
services.AddSingleton<IApplicationModelFactory>(provider => modelFactory);
services.AddSingleton<IApplicationModelUpdate>(provider => modelFactory);
services.AddScoped<ApplicationModel[]>(provider => modelFactory.GetModel());
注入(inject) IApplicationModelUpdate进入更新模型的类型和 ApplicationModel[]进入使用它的类型。这样做的好处是,为同一请求解析的所有类型都将获得模型的一致 View ,即使它在处理该请求的过程中发生了变化。
你也可以注入(inject) IApplicationModelFactory到消费者代码中,但我认为直接注入(inject)模型更好。使用工厂可能会导致不同位的代码在同一请求期间看到不同的模型。模型的可变性也是消费者代码不必担心的一个实现细节。

关于c# - 更新依赖注入(inject)的单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53287667/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com