覆盖宁静框架如何处理 [ConnectionKey] 属性

Overriding how serenity framework handles [ConnectionKey] attribute

Serenity 具有 class 属性 ConnectionKey,它允许您指定要使用的连接字符串的键。

下面的代码示例:

    [ConnectionKey("Default"), Module("Administration"), TableName("Languages")]
    [DisplayName("Languages"), InstanceName("Language")]
    [ReadPermission(PermissionKeys.Translation)]
    [ModifyPermission(PermissionKeys.Translation)]
    [LookupScript(typeof(Lookups.LanguageLookup))]
    public sealed class LanguageRow : Row, IIdRow, INameRow
    {
        [DisplayName("Id"), Identity]
        public Int32? Id
        {
            get { return Fields.Id[this]; }
            set { Fields.Id[this] = value; }
        }
    }

在我的例子中,我使用 AWS Secret Manager 来隐藏任何敏感信息,因此连接字符串本身不在我的应用程序设置中,而是一个 AWS 密钥。因此,当此代码被命中时,它会抛出错误,因为密钥不是有效的连接字符串。

要获取实际的连接字符串,我首先需要向 AWS Secret Manager 发出请求。

在他们 documentation 大约三分之一的页面,在 SqlConnections.New 方法 部分,他们提到了我如何指定一个连接我的应用程序设置中不存在的字符串。但是,我不知道如何将此解决方案应用于我的特定问题。

有没有办法覆盖 Serenity 处理此 ConnectionKey 的方式或解决此问题的任何其他解决方法?

Serenity 具有通过依赖注入注入的连接源。您可以找到注入线 there。如果您想自己管理它,只需从启动中删除 AddSqlConnections 并手动添加实现 IConnectionStrings 接口的连接字符串源。

There is 默认 IConnectionStrings 实现您可以用作示例。

我对这个问题的最终解决方案是利用 SqlConnections class、SetConnection 中的静态方法,这允许我将不同的连接字符串与默认 connectionKey 相关联.

var csInfo = SqlConnections.GetConnectionString("SecretConnectionKey");

var connectionString = SecretManagerService.GetSecretAsync(csInfo.ConnectionString, RegionEndpoint.USEast1).Result;

SqlConnections.SetConnection("Default", connectionString, csInfo.ProviderName);

这段代码放在启动时Configure方法的底部。

为此,您还需要在 appsettings.json 文件中添加一个空的默认 ConnectionString。

{
  "Data": {
    "SecretConnectionKey": {
      "ConnectionString": "secretkey",
      "ProviderName": "System.Data.SqlClient"
    },
    "Default": {
      "ConnectionString": "",
      "ProviderName": "System.Data.SqlClient"
    }
  },

我认识到这确实是一个 hacky 方法,但是找不到一个时间有效的解决方案,这将被升级到 .Net 所取代5.0.