什么是应用日志记录而不会让登录混乱代码的巧妙方法

本文关键字:代码 混乱 登录 方法 应用 日志 记录 什么 | 更新日期: 2023-09-27 18:32:19

目前我正在实现一个导入模块。但也必须记录每个操作。例如。导入客户时,我需要检查该客户是否已存在,如果客户不存在,则需要创建客户。我需要记录这两种情况。

所以目前我有一些这样的代码:

public event Action<string> OnMessageLog;
public void ImportOrder()
{
    LogMessage("The order is being created");
    var customer = ImportCustomer("MG_001");
    var order = new Order{ Customer = customer };
    LogMessage("The order is created");
    unitOfWork.Orders.AddObject(order);
}
public Customer ImportCustomer(string customerCode)
{
    var customer = this.unitOfWork.Customers.GetByCode(customerCode);
    if(customer == null)
    {
        LogMessage("The customer doesn't exists. A new customer is created");
        customer = new Customer{ ''.. here some initialization };
    }
    else
    {
       LogMessage("The customer exists.");
    }
    return customer;
}
private void LogMessage(string message)
{
     if(OnMessageLog != null)
     {
         OnMessageLog(message);
     }
}

我真的不喜欢这样,因为我认为所有的"LogMessage(...)"调用都不是很整洁。

作为替代方案,我正在考虑使用装饰器模式,但这变得难以实现,因为导入非常复杂。这意味着我需要为每个操作创建 2 个方法(我有很多操作)。

您是否有一些建议或想法可以使此代码更具可读性/更整洁?

什么是应用日志记录而不会让登录混乱代码的巧妙方法

您可以使用PostSharp之类的工具尝试面向方面的编程。

我认为Decorator是一种要走的路。提取 GetCustomerByCode 和 CreateCustomer 方法是一个好主意,即使您不需要任何日志记录。可能其中一些方法将在整个模块中重用,也可能不会。它仍然使代码更具可读性、可测试性和维护性。

public Customer ImportCustomer(string customerCode)
{
    var customer = GetCustomerByCode(string customerCode);
    if (customer == null)
    {
        customer = CreateCustomer();
    }
    return customer;
}
public Customer GetCustomerByCode(string customerCode)
{
    var customer = this.unitOfWork.Customers.GetByCode(customerCode);
    return customer;
}
public Customer CreateCustomer()
{
    var customer = new Customer{ ''.. here some initialization };
    return customer;
}