Leo*_*ett 7 c# service asp.net-core asp.net-core-mvc-2.0
我在 ASP.Net Core 应用程序中使用 DI 注入了一些服务。这些服务使用几个可写配置对象,我也使用 DI 注入这些对象。但是,由于这些服务需要是单例的,因此配置对象仅在服务启动时传递,因此不会拾取对其的任何更改。所以我需要重新启动这些单例,或者以某种方式将新的IOptionsSnapshot传递给它们。
为了进一步澄清,这是我的代码:
启动.cs:
//Inject service and config object
services.ConfigureWritable<DataSettings>(Configuration.GetSection("DataSettings"));
services.AddSingleton<IHostedService, DataService>();
Run Code Online (Sandbox Code Playgroud)
数据服务.cs:
public DataService(IOptionsSnapshot<DataSettings> data)
{
//_options is used to configure the service
this._options = data.Value;
}
Run Code Online (Sandbox Code Playgroud)
数据控制器.cs:
public DataController(IWritableOptions<DataSettings> data)
{
_data = data;
}
[HttpPost("conf/data/new")]
public void InsertData([FromBody] IEnumerable<ModuleSettings> newData)
{
var data = _data.Value.Data.ToList();
data.AddRange(newData.ToList());
_data.Update(d => d.Data = data.ToArray());
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我使用Startup.cs中的配置对象设置了我的服务。然后,我将配置对象传递给我的服务和用于配置服务的控制器。该接口IWritableOptions派生自appsettings.jsonIOptionsSnapshot并可用于写回对 appsettings.json 的更改。这一切都有效,但是,当我更改配置对象并更新appsettings.json时,更改不会传递到我的服务中。重新启动整个应用程序会有点过分,所以我正在寻找一种方法来重新启动该服务或以某种方式在其中设置配置对象。我无法公开服务的属性,因为这些服务是动态配置的,因此可能有 2、3 个服务在后台运行。_options
一些可能有帮助的想法:
您确定您的服务需要是单例吗?大多数时候,像这样的数据访问服务不需要,而是可以设置范围(每个 Web 请求 1 个实例)。如果您能支持的话,这将消除您的问题。
您可以传入 IOptions 或您将创建的某些自定义 OptionsReader 类型,而不是传入 IOptionsSnapshot,这将通过方法主动从配置中读取当前值。从您的单例服务调用此方法,您应该能够获取任何给定调用的当前连接详细信息。
修改您的服务以接受其连接详细信息作为其方法签名的一部分。并不理想,因为您可能需要将其添加到许多方法中,但它可以实现您的目标。
我还没有尝试过,但您可能可以在运行时(启动后)替换(或删除)服务集合中的单例服务。如果您在配置更新时将其删除,则下次请求时将创建一个新配置。这是一个相关的答案,展示了如何从启动中执行此操作:/sf/answers/3006276171/
| 归档时间: |
|
| 查看次数: |
4685 次 |
| 最近记录: |