首页 > 解决方案 > 更新依赖注入的单例

问题描述

我在运行时生成一个单例

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?
}

标签: c#.net-coreasp.net-core-2.0

解决方案


您应该使用额外的间接层。定义一个类似这样的接口:

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());

这样做的好处是每个请求都将获得模型的一致视图,即使它在处理该请求的过程中发生了变化。


推荐阅读