C#Helper模式与服务方法

时间:2012-12-23 13:56:23

标签: c# design-patterns helper

假设我们有以下课程:

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类
  3. 上创建一个静态Helper类
  4. 直接在Service类
  5. 上创建一个静态Helper类
  6. 只需将方法直接添加到服务类中,就像任何其他服务方法一样
  7. ......比这些更好的解决方案?
  8. 为了清楚起见,这就是我对#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 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

我认为答案取决于您希望调用该方法的人。

就个人而言,我会将静态方法放在TicketService类上,因为它可以在多个实体上运行,并使其对服务本身是私有的。

然后,我将在服务上创建一个实例方法,以向服务的任何使用者公开该功能。它有点使API更清洁,并避免人们必须知道某些东西是否是静态方法的实现细节。

答案 2 :(得分:1)

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

它具有以下优点:

  • 能够实现界面
  • 提供可以在依赖项注入方案中传递给方法或构造函数的对象
  • 提供静态行为
public interface ITicketHelper
{
    void HelpThis(Ticket t);
    IList<Ticket> HelpThat();
}

public class TicketHelper : ITicketHelper
{
    public static readonly ITicketHelper Instance = new TicketHelper();

    private TicketHelper()
    { ... }

    public void HelpThis(Ticket t)
    { ... }

    public IList<Ticket> HelpThat()
    { ... }
}

用法

 var result = TicketHelper.Instance.HelpThat();

答案 3 :(得分:0)

我不会称其为辅助方法。这是一种聚合方法。因此,我将使用此方法制作一个名为TicketAggregator的类。然后,当您有诸如“ GetAverageTicketPrice”之类的其他名称时,也可以将其放入TicketAggregator中。

通过将其命名为TicketAggregator,您可以更清楚地描述其内容。有人立即知道该类中有什么方法。此外,helper这个词真的没有任何意义……不是所有的方法都可以帮助您吗?