我在运行时生成一个单例
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?
}
答案 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());
其优点是,即使每个请求在处理该请求的过程中发生更改,每个请求都将获得模型的一致视图。