2009-08-05 47 views
2

我已經將Enum定義爲ASP.NET MVC應用程序的模型對象的一部分。Enum可能過於臃腫嗎?

枚舉被稱爲「CONTENTTYPES」,看起來是這樣的:

public enum ContentTypes 
{ 
    [Description("News story")] 
    NewsStory = 1, 

    [Description("Article")] 
    Article = 2 
} 

現在我打算到另一組屬性添加到一個名爲「路線」枚舉項目。該屬性將允許我將每個ContentType映射到可以處理它的URL。

所以在此之後我將有:

public enum ContentTypes 
{ 
    [Description("News story")] 
    [Route("news/item/{URLName}")] 
    NewsStory = 1, 

    [Description("Article")] 
    [Route("article/item/{URLName}")] 
    Article = 2 
} 

你認爲枚舉在這一點上過於沉重的重量?

將枚舉項分解爲類,然後給每個類一個'描述'和'路由'屬性會更好嗎?

回答

8

您確實試圖使用Enum來區分Content對象的多個變體,而不會遇到實際創建Content對象的多個版本的麻煩。

這是一個很好的選擇,應用程序的行爲將取決於Enum的設置。例如,你可能有類似的東西:

public Content 
{ 
    private ContentTypes contentType; 
    public string ToString() 
    { 
     switch (contentType) 
     ... 
    } 
} 

這會讓你從可維護性的角度來說很瘋狂。考慮而不是使用繼承來得到你所追求的行爲:

public Content 
{ 
    public abstract string ToString(); 
} 

public NewsStory : Content 
{ 
    public override string ToString() { /* Appropriate formatting of output */ } 
} 

public Article : Content 
{ 
    public override string ToString() { /* Appropriate formatting of output */ } 
} 

我們真正看中的(和使用設計按合同法),考慮所有的事情的任何內容將有共同和定義接口,例如IContent。如果你這樣做,你可以做這樣的事情:

List<IContent> myContent; 
foreach (IContent ic in myContent) ic.ToString(); 
2

我個人認爲枚舉應該保持簡單。在不僅僅是助記符的地方,我會考慮福勒的「用狀態/策略模式替換類型代碼」。

所以,是的,我會轉換爲一個類。

1

您可以將您的屬性,所以它看起來更像是這樣的:

[Description("x"), Route("y")] 

,如果你認爲語法看起來更好。但我同意米奇的觀點,這些可能會更好地作爲課堂,尤其是如果有機會你可能需要在將來添加另一個屬性。