是在方法调用之前或之后创建的对象
本文关键字:或之后 创建 对象 方法 调用 | 更新日期: 2023-09-27 18:29:26
我有三个不同的数据库,我需要检查我是否连接到了它们。这是我最初拥有的,运行非常好。
public async Task<ServiceAvailabilityDTO> ServiceAvailabilityStatus()
{
return new ServiceAvailabilityDTO
{
IsDb1Online = await IsDb1Available(),
IsDb2Online = IsDb2Available(),
IsDb3Online = await IsDb3Available()
};
}
private async Task<bool> IsDb1Available()
{
var count = await _db1Service.GetDbCount();
if (count > 0)
return true;
return false;
}
private bool IsDb2Available()
{
if (_db2Service.GetDbCount() > 0)
return true;
return false;
}
private async Task<bool> IsDb3Available()
{
var pong = await _db3Provider.PingDb();
if(pong.Success == true && pong.Version != null)
return true;
return false;
}
但是,现在我需要在每次DB检查的DTO中记录异常消息。
public async Task<ServiceAvailabilityDTO> ServiceAvailabilityStatus()
{
return new ServiceAvailabilityDTO
{
IsDb1Online = await IsDb1Available(),
IsDb2Online = IsDb2Available(),
IsDb3Online = await IsDb3Available(this) // This is an example. I want to pass the reference of **ServiceAvailabilityDTO** to **IsDb3Available**
};
}
private async Task<bool> IsDb3Available(ServiceAvailabilityDTO availability)
{
try
{
var pong = await _db3Provider.PingDb();
if(pong.Success == true && pong.Version != null)
return true;
return false;
}
catch (Exception e)
{
var exceptionMessage = e.Message;
if (e.InnerException != null)
{
// This is what I hope to put into the object reference
exceptionMessage = String.Join("'n", exceptionMessage, e.InnerException.Message);
availability.db3Exception = exceptionMessage ;
}
return false;
}
}
我的问题是;
我可以保持我的返回方法与第一个例子中的相同,并将对象引用传递给每个方法来存储异常,同时仍然返回我的bool值吗。
或者,直到所有方法调用都发生了,才创建对象,然后用返回的值创建对象?
我知道我可以正常创建对象并将其传递给每个方法调用,但正是这种方法启发我提出这个问题,纯粹是为了了解情况和学习从…起
谢谢。
不,您不能这样做,因为在您所做的上下文中,this
不是指您正在填充的对象,而是指包含您正在调用的方法的对象。
public async Task<ServiceAvailabilityDTO> ServiceAvailabilityStatus()
{
return new ServiceAvailabilityDTO
{
IsDb1Online = await IsDb1Available(),
IsDb2Online = IsDb2Available(),
IsDb3Online = await IsDb3Available(this) // here 'this' does NOT ref to ServiceAvailabilityDTO
};
}
也没有引用ServiceAvailabilityDTO
的关键字,因此您只能创建对象,并将其传递给每个方法。在这一点上,我认为返回布尔值也没有多大意义——你还可以在行中设置布尔值属性
public async Task<ServiceAvailabilityDTO> ServiceAvailabilityStatus()
{
var sa = new ServiceAvailabilityDTO();
await CheckDb1Available(sa);
CheckDb2Available(sa);
await CheckDb3Available(sa);
return sa;
}
(注意,我已经将方法从Is*
重命名为Check*
,因为前者意味着返回布尔值,后者意味着内联。)