2012-12-23 31 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();