【发布时间】:2021-09-25 12:32:21
【问题描述】:
我的 DB 类定义如下:
public class DbAdapterService : DbAdapterService
{
private readonly AppSettings _settings;
public DbAdapterService(IOptions<AppSettings> settings)
{
_settings = settings?.Value;
DbConnectionStringBuilder builder = new DbConnectionStringBuilder();
builder.ConnectionString = _settings.ConnectionString;
}
}
在上面的类中,我从我的 appsettings.json 中获取我的连接字符串,它工作正常。
现在我们需要从我们类中定义的另一个方法中获取连接字符串用户名和密码。此方法从我们存储的保管库中获取这些详细信息。示例如下:
public class CredentialsService : ICredentialsService
{
public Credentials GetDetails()
{
//return credentials
}
}
我的问题是我可以在上面的 DbAdapterService 构造函数中调用这个方法吗,或者是否有更好的方法来处理这个问题。
谢谢
--更新--
public class DbAdapterService : DbAdapterService
{
private readonly AppSettings _settings;
public ICredentialsService _credentialsService;
private bool isInitialized = false;
public DbAdapterService(IOptions<AppSettings> settings, ICredentialsService credentialsService)
{
_settings = settings?.Value;
_credentialsService = credentialsService;
if (!isInitialized)
{
Initialize(_credentialsService);
}
DbConnectionStringBuilder builder = new DbConnectionStringBuilder();
builder.ConnectionString = _settings.ConnectionString;
}
public void Initialize(ICredentialsService credentialsService)
{
if (isInitialized)
return;
else
{
//credentialsService.GetDetails();
isInitialized = true;
}
}
}
【问题讨论】:
-
一般构造函数不应该接触其他服务。如果 DbAdapterService 需要从其他地方获取连接详细信息,它应该有一个可以调用的 Initialize(或 InitializeAsync)方法,并且该方法可以访问 API 或数据库或任何地方以获取所需的值。
-
@GertArnold 没错,我从来没有说过不是。恐怕我不明白你评论的重点。你能解释一下你为什么这么说吗?
-
@GertArnold 访问另一个服务(例如 API 或数据库)是一种固有的危险操作,通常需要异步完成。这种逻辑不属于构造函数体。见Meligy's answer here。自从编写了该答案以来,异步代码变得更加多产,并且从构造函数调用异步代码并不是一种令人愉快的方式。这里的问题中有一行“`此方法从我们存储的保险库中获取这些详细信息。” - 我们还没有看到它的细节,但它可能是异步的
-
@mason 能否分享一个示例,说明如何使用 Initialize 方法和构造函数来获取这些详细信息
-
它不会在构造函数中。这就是重点:构造函数不是处理这类事情的好地方。相反,您可以将该逻辑放入一个方法中,然后您可以调用该方法从您需要的任何外部来源获取详细信息。
标签: c# asp.net .net asp.net-core .net-core