c#助手模式vs服务方法

本文关键字:服务 方法 vs 模式 | 更新日期: 2023-09-27 17:49:15

假设我们有以下类:

public class Ticket {
  public int Id { get; set; }
  public string Event { get; set; }
  ...
}
public class TicketService {
  public void acceptTicket(Ticket ticket) {
    ...
  }
  ...
}

我的问题是,添加与票证实体相关的静态助手方法(不需要像服务类那样的状态)的最佳位置在哪里?(请记住,这是整个系统中许多其他实体/服务中的一个实体/服务)。

现在我在考虑以下可能性:

  1. 在自己的。cs文件中创建一个名为TicketHelper的新类。
  2. 直接在Ticket类上创建一个静态Helper类
  3. 直接在Service类
  4. 上创建一个静态Helper类
  5. 直接将这些方法添加到服务类中,就像其他服务方法一样
  6. …有比这些更好的解决方案吗?

为了清楚起见,以下是我对#2或#3的意思。

public class TicketService {
  public void acceptTicket(Ticket ticket) {
    ...
  }
  ...
  public static class Helper {
    public static Dictionary<string, List<Ticket>> groupByName(List<Ticket> tickets) {
      // returns the map of name/tickets
    }
  }
}
在这种情况下,API可能如下所示:
Ticket ticket = new Ticket();
List<Ticket> tickets = new List<Tickets>();
TicketService service = new TicketService();
service.acceptTicket(ticket);
// leaving out the creation of a list of tickets...
var groups = TicketService.Helper.groupByName(tickets);

c#助手模式vs服务方法

您可以为此使用扩展方法。在单独的TicketExtensions类中创建它们。

public static class TicketExtensions {
  public static Dictionary<string, List<Ticket>> groupByName(this List<Ticket> tickets) {
    // returns the map of name/tickets
  }
}
...
var ticket = new Ticket();
var tickets = new List<Tickets>();
var service = new TicketService();
service.acceptTicket(ticket);
// leaving out the creation of a list of tickets...
var groups = tickets.groupByName();

同时,使用IEnumerable<T>IList<T>IDictionary<K, V>这样的接口比使用具体的集合类更可取。

另一种可能性是使用单例模式。

它具有以下优点:

  • 能够实现一个接口
  • 提供一个对象,可以在依赖注入场景中传递给方法或构造函数
  • 提供静态行为
public interface ITicketHelper
{
    void HelpThis(Ticket t);
    IList<Ticket> HelpThat();
}
public class TicketHelper : ITicketHelper
{
    public static readonly TicketHelper Instance = new TicketHelper();
    private TicketHelper()
    { ... }
    public void HelpThis(Ticket t)
    { ... }
    public IList<Ticket> HelpThat()
    { ... }
}
使用

 var result = TicketHelper.Instance.HelpThat();

我想答案取决于您期望谁调用该方法。

就我个人而言,我会把静态方法放在TicketService类上,因为它工作在多个实体上,并使其对服务本身私有。

然后,我将在服务上创建一个实例方法,将该功能公开给服务的任何消费者。它使API更清晰,避免了人们必须知道实现细节,无论某物是否是静态方法。

我不会称它为助手方法。这是一个聚合方法。我会创建一个类叫TicketAggregator用这个方法。然后,当你有其他像"GetAverageTicketPrice",你也可以把它放在TicketAggregator。

通过将其命名为TicketAggregator,您可以更清楚地描述它的内容。通过类的名字就能立即知道类中有哪些方法。再说,帮手这个词没有任何意义……不是所有的方法都对你有帮助吗?