您也可以注册 POCO 设置以进行注入,但是您会失去一些与何时注入相关的功能appsettings.json
被编辑。
services.AddTransient<XOptions>(
provider => provider.GetRequiredService<IOptionsSnapshot<XOptions>>().Value);
现在当你注射时XOptions
在构造函数中,您将获得该类。但是当你编辑你的appsettings.json
,直到下次解决该值时才会更新,对于范围服务来说,该值将在下一个请求和单例服务上never.
另一边注射IOptionsSnapshot<T>
.Value
总是会为您提供当前设置,即使appsettings.json
已重新加载(假设您使用.AddJsonFile("appsettings.json", reloadOnSave: true)
).
保持功能不拉动的明显原因Microsoft.Extensions.Options
打包到您的服务/域层中将创建您自己的接口和实现。
// in your shared service/domain assembly
public interface ISettingsSnapshot<T> where T : class
{
T Value { get; }
}
并在应用程序端实现它(在您的服务/域程序集之外),即MyProject.Web
(其中 ASP.NET Core 和组合根在哪里)
public class OptionsSnapshotWrapper<T> : ISettingsSnapshot<T>
{
private readonly IOptionsSnapshot<T> snapshot;
public OptionsSnapshotWrapper(IOptionsSnapshot<T> snapshot)
{
this.snapshot = snapshot ?? throw new ArgumentNullException(nameof(snapshot));
}
public T Value => snapshot.Value;
}
并将其注册为
services.AddSingleton(typeof(ISettingsSnapshot<>), typeof(OptionsSnapshotWrapper<T>));
现在您已经消除了对IOptions<T>
and IOptionsSnapshot<T>
从您的服务中保留它的所有优点,例如编辑 appsettings.json 时更新选项。当你改变DI时,只需更换OptionsSnapshotWrapper<T>
随着您的新实施。