更新依赖项注入的单例

时间:2018-11-13 18:48:51

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

我在运行时生成一个单例

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

2 个答案:

答案 0 :(得分:1)

我不会那样依赖依赖注入。而是注入一个工厂,并编写返回适当实例所需的任何逻辑。

简单工厂:

interface IApplicationModelFactory
{
    ApplicationModel[] Model { get; }
}

class ApplicationModelFactory : IApplicationModelFactory
{
    public ApplicationModel[] Model { get; set; }
}

注册:

services.AddSingleton<IApplicationModelFactory>
(
    new ApplicationModelFactory[] { Model = util.generateApplications() }
)

接受注射的班级:

class Foo
{
    protected readonly IApplicationModelFactory _factory;

    public Foo(IApplicationModelFactory injected)
    {
        _factory = injected;
    }

    protected ApplicationModel[] => _factory.Model;

    public void Bar()
    {
        DoSomethingWithModel(this.ApplicationModel);
    }
}      

答案 1 :(得分:0)

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

interface IApplicationModelFactory
{
    public ApplicationModel[] GetModel();
}

使用更新模型所需的方法定义第二个接口:

interface IApplicationModelUpdate
{
    void UpdateModel();
}

然后您可以将ApplicationModel[]注册从单个实例更改为作用域并委托给工厂:

var modelFactory = new ApplicationModelFactory();
services.AddSingleton<IApplicationModelFactory>(provider => modelFactory);
services.AssSingleton<IApplicationModelUpdate>(provider => modelFactory);
services.AddScoped<ApplicationModel[]>(provider => modelFactory.GetModel());

其优点是,即使每个请求在处理该请求的过程中发生更改,每个请求都将获得模型的一致视图。