c# - 所有服务均可访问的 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 方法查询日志的服务?
解决方案
如果所有受影响的表要么从单个基类继承,要么实现相同的接口,那么您可以在基类上使用具体方法或扩展方法,这样您就可以编写一次实现,但可以流畅地使用它。
某些任务(例如 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 脚本或其他自动化逻辑进行定位变得更加简单。
推荐阅读
- amazon-web-services - 如果我在不到一小时的时间内删除 AWS 资源,是否需要付费?
- c++ - cmake CMAKE_PREFIX_PATH 不适用于 set()
- android - 如何在保持应用响应的同时显示大量数据
- python - 熊猫用其他数据框替换数据框中的行
- firebase - 将 Firebase 与 Google Business 结合使用以接收电子邮件
- jenkins - 从 Jenkins 管道更新 Jira 任务
- reactjs - 正确的返回类型的组件返回一个包装的组件
- java - Swagger/OpenAPI 3.0 生成 - 具有来自接口的通用列表的端点未显示在文档中
- apache-zookeeper - 具有分层仲裁的 Zookeeper HA 设置(6 个节点)
- javascript - 无法调试 Chrome 扩展的“content_scripts”中列出的 JavaScript 代码