2012-12-23 35 views
4

比方说,我们有以下类别:C#辅助模式VS服务方法

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. 直接在票务类创建一个静态辅助类
  3. 直接在服务类中创建一个静态辅助类
  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); 
+0

这张票已经是2岁。现在你走哪条路? –

+0

我尝试使用外部帮助器方法,以便测试更容易。 –

回答

1

我想,答案取决于你希望是调用方法谁。

就个人而言,我会把静态方法上的票务类,因为它适用于比一个单一的实体多,并使其私人服务本身。

然后我会在服务中创建一个实例方法的功能暴露给任何服务消费者。它使得API更清洁,并避免人们必须知道是否静态方法的实现细节。

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

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

它的优点是:

  • 能够实现一个接口
  • 提供一个对象,你可以传递给方法或构造函数的依赖注入方案
  • 提供静态
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();