.net core,n层应用程序,服务层是否应该依赖于Microsoft.Extensions.Options.dll

2024-01-07

简单的问题是: Microsoft.Extensions.Options.IOptions 是否只能在伞式应用程序(本例中为 Web 应用程序)上下文中使用,或者也可以在类库中使用?

Example:

在一个 n 层的 ASP.NET Core 应用程序中,我们有一个服务层,它依赖于来自以下位置的一些设置:appsettings.json file.

我们首先从 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,直到下次解决该值时才会更新,对于范围服务来说,该值将在下一个请求和单例服务上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>随着您的新实施。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.net core,n层应用程序,服务层是否应该依赖于Microsoft.Extensions.Options.dll 的相关文章

随机推荐