基于 appconfig 在可实例化 class 上初始化持久值

Initialise persistant value on instantiable class based on appconfig

如何在 class 上创建每次创建时都保持不变的持久值?

public record StorageUrl
{
    public string FileName { get; set;}
    public string BaseAddress {get; set;}
    public string FullPath => $"{BaseAddress}/{FileName}";
}

我希望 BaseAddress 的值来自配置文件。

我目前的方法是每次我想初始化一个 StorageUrl 时注入 IOptions<BaseAddressSettings> 有没有办法设置 BaseAddress 而不必每次都注入 IOptions时间.

我想初始化 class 喜欢

var storageUrl = new StorageUrl { FileName = "fileName" };

我目前正在这样初始化

var storageUrl = new StorageUrl 
{ 
   FileName = "fileName", 
   BaseAddress = options.BaseAddress
};

除了从您的应用程序代码中这样做之外,确实没有办法将 IOptions 实例注入构造函数。

一个选项是创建一个 non-default 构造函数,它将 IOptions 实例作为参数。所以你的构造函数看起来像这样:

public class StorageUrl
{
    public StorageUrl(string fileName, IOptions<BaseAddressSettings> options)
    {
        FileName = fileName;
        BaseAddress = options.Value.BaseAddress;
    }
}

您的应用程序代码将如下所示:

var storageUrl = new StorageUrl("fileName", options);

另一种选择是使用工厂。这主要在 class 有复杂的创建要求时有用。因此,对于此应用程序来说,它可能有点矫枉过正,但它可以帮助您的应用程序随着需求变得更加复杂而增长。

工厂服务:

public class StorageUrlFactory
{
    private readonly IOptions<BaseAddressSettings> options;

    public StorageUrlFactory(IOptions<BaseAddressSettings> options)
    {
        this.options = options;
    }

    public StorageUrl Create(string fileName)
    {
        return new StorageUrl
        {
            FileName = fileName,
            BaseAddress = options.Value.BaseAddress
        };
    }
}

在您的应用程序代码中,您将使用 DI 注入工厂服务并调用它来创建这样的实例:

var storageUrl = storageUrlFactory.Create("fileName");