首页 > 解决方案 > 所有服务均可访问的 C# 全局方法

问题描述

我有很多服务可以在我的项目中获取和操作数据。

我想从每个服务访问一个方法,该方法本质上是查询日志表以获取实体的创建者/最后一个编辑器。

注入/引用此方法的最佳方法是什么?

例如,在我的 SalesOrderService 中,我有以下方法:

public void GetSalesOrder(int salesOrderId)
    {
        SalesOrder salesOrder = _context.SalesOrder.Where(o => o.SalesOrderId == salesOrderId).FirstOrDefault();
        //Insert into my view model here
    CreatedBy = GetCreator("SalesOrder",salesOrderId);

    }

如何生成和引用使用 GetCreator 方法查询日志的服务?

标签: c#entity-framework

解决方案


如果所有受影响的表要么从单个基类继承,要么实现相同的接口,那么您可以在基类上使用具体方法或扩展方法,这样您就可以编写一次实现,但可以流畅地使用它。

某些任务(例如 EF 中的审计跟踪)可以单独使用命名约定来实现,但是即使您将使用约定来执行逻辑,您仍然应该使用接口来强制执行约定,将它们变成规则,而不是一般准则。

public interface IAudiObject
{
    int Id { get; set; }
}
public static User GetCreator(this IAuditObject record)
{
    // use the record.Id to resolve the user info
    // resolve the tablename either from the Table attribute on the record definition or the recrod.GetType().Name.
}
partial class SalesOrder : IAudiObject
{
    // This class doesn't follow the convention of Id for the key name, we can still implement the interface explicitly:
    int IAudiObject.Id { get => this.SalesOrderId; set => this.SalesOrderId = value; }
}

使用示例

public void GetSalesOrder(int salesOrderId)
{
    SalesOrder salesOrder = _context.SalesOrder.Where(o => o.SalesOrderId == salesOrderId).FirstOrDefault();
    //Insert into my view model here
    CreatedBy = salesOrder.GetCreator();
}

当然有完全不同的方法来做同样的事情,但是拥有一个接口使得通过 IoC、T4 脚本或其他自动化逻辑进行定位变得更加简单。


推荐阅读