5

假设我们有以下类:

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类上创建静态Helper类
  4. 只需将方法直接添加到服务类中,就像任何其他服务方法一样
  5. ...比这些更好的解决方案?

为了清楚起见,这就是我对#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);
4

4 回答 4

3

您可以为此使用扩展方法。在单独的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>比具体的集合类更可取。

于 2012-12-23T14:11:43.553 回答
2

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

它具有以下优点:

  • 能够实现接口
  • 提供一个可以在依赖注入场景中传递给方法或构造函数的对象
  • 提供静态行为
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();
于 2012-12-23T15:05:32.707 回答
1

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

就个人而言,我会将静态方法放在 TicketService 类上,因为它适用于多个实体,并将其设为服务本身的私有方法。

然后我将在服务上创建一个实例方法,以将功能公开给服务的任何消费者。它在某种程度上使 API 更简洁,并避免人们必须知道某个东西是否是静态方法的实现细节。

于 2012-12-23T14:02:45.693 回答
0

我不会称它为辅助方法。这是一种聚合方法。所以我会用这个方法创建一个名为 TicketAggregator 的类。然后,当您有其他类似“GetAverageTicketPrice”时,您也可以将其放入 TicketAggregator。

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

于 2020-02-05T18:30:29.970 回答