是在方法调用之前或之后创建的对象

本文关键字:或之后 创建 对象 方法 调用 | 更新日期: 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;
    }
}

我的问题是;

  1. 我可以保持我的返回方法与第一个例子中的相同,并将对象引用传递给每个方法来存储异常,同时仍然返回我的bool值吗。

  2. 或者,直到所有方法调用都发生了,才创建对象,然后用返回的值创建对象?

我知道我可以正常创建对象并将其传递给每个方法调用,但正是这种方法启发我提出这个问题,纯粹是为了了解情况和学习从…起

谢谢。

是在方法调用之前或之后创建的对象

不,您不能这样做,因为在您所做的上下文中,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*,因为前者意味着返回布尔值,后者意味着内联。)