加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

配置 – .net核心,n层应用程序,服务层应该依赖于Microsoft.Exten

发布时间:2020-12-14 04:26:19 所属栏目:Windows 来源:网络整理
导读:直截了当的问题是:Microsoft.Extensions.Options.IOptions是否只能在伞形应用程序(在本例中为Web应用程序)或类库中使用? 例: 在一个n层的asp.net核心应用程序中,我们的服务层依赖于来自appsettings.json文件的一些设置. 我们刚开始的是Startup.cs中的这些
直截了当的问题是:Microsoft.Extensions.Options.IOptions是否只能在伞形应用程序(在本例中为Web应用程序)或类库中使用?

例:

在一个n层的asp.net核心应用程序中,我们的服务层依赖于来自appsettings.json文件的一些设置.

我们刚开始的是Startup.cs中的这些内容:

services.Configure<Services.Options.XOptions>(options =>
  {
    options.OptionProperty1 = Configuration["OptionXSection:OptionXProperty"];
  });

然后在服务构造函数中:

ServiceConstructor(IOptions<XOptions> xOptions){}

但是,假设在我们的服务层中,我们依赖于Microsoft.Extensions.Options.

我们不确定这是推荐的方式还是有更好的做法?

我们的服务类库应该知道DI容器实现,这感觉有点尴尬.

解决方法

您也可以注册POCO设置进行注入,但是丢失了与appsettings.json编辑时相关的一些功能.

services.AddTransient<XOptions>(
    provider => provider.GetRequiredService<IOptionsSnapshot<XOptions>>().Value);

现在,当您在构造函数中注入XOptions时,您将获得该类.但是当您编辑appsettings.json时,该值将不会更新,直到下次解决时,对于作用域服务将在下一个请求和单件服务永远不会.

另一方面,注入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核心和组合根目录)

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>和IOptionsSnapshot< T>从您的服务中获得所有优势,例如在编辑appsettings.json时更新选项.更改DI时,只需替换OptionsSnapshotWrapper< T>与您的新实施.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读