2014年3月24日 星期一

ASP.NET MVC 4 WebApi -- 利用繼承實作多專案間的部分類別(partial)

多人開發的專案裡,部分類別(partial)是非常好用的東西,但有個小小的缺點,只能再同一個exe或dll才有作用,如果是參考其他專案的dll,編譯就會失敗
為了減少相同程式碼出現的頻率,所以改用繼承的方式

A專案
namespace A.Models
{
    public class Field
    {
        public Guid FieldId { get; set; }
        public DateTime CreateOn { get; set; }
        public Guid Creater { get; set; }
        public DateTime UpdateOn { get; set; }
        public Guid Updater { get; set; }
  
        public ICollection Language { get; set; }
    }

    public class FieldLanguage
    {
        public Guid FieldLanguageId { get; set; }
        public string Aliases { get; set; }
        public string Notes { get; set; }
        public string Language { get; set; }
  
        public Field Field { get; set; }
    }
}

B專案(參考A專案)
namespace B.Models
{
    public class Field : A.Models.Field
    {
  //放置View所需語系資料
        public string Language_Aliases { get; set; }
        public string Language_Notes { get; set; }
    }
}

當需要把FieldLanguage放到變數中做處理時,就會發生"找不到類型或命名空間名稱'FieldLanguage'"的錯誤

B的Model追加FieldLanguage,因為欄位相同,所以一樣繼承A的FieldLanguage
public class FieldLanguage : A.Models.FieldLanguage { }

雖然解決了找不到類別的問題,但是也多了"類型'A.Models.FieldLanguage'不能隱含轉換為'B.Models.FieldLanguage'"的錯誤
原來繼承裡面所關聯的類別是原本所指定的,不會因為繼承的專案有相同類型名稱而轉換過去,所以繼承後要再把關聯加回去
public ICollection FieldLanguage { get; set; }

這邊會有一個警告,"'B.Models.FieldLanguage'隱藏了繼承的成員'A.Models.FieldLanguage'。如果是刻意要隱藏,請使用new關鍵字"
因為名稱是一樣的,所以編譯器會自動把父類別的屬性或方法隱藏掉
PS:範例是用屬性,所以用new的方式,如果是方法,請盡量使用override(可參考new和override的差異與目的)
public new ICollection FieldLanguage { get; set; }

FieldLanguage當然也要參考回Field
public new Field Field { get; set; }

最後B的類別如下:
namespace B.Models
{
    public class Field : A.Models.Field
    {
        public string Language_Aliases { get; set; }

        public string Language_Notes { get; set; }

        public new ICollection FieldLanguage { get; set; }
    }

    public class FieldLanguage : A.Models.FieldLanguage
    {
        public new Field Field { get; set; }
    }
}
以上就可以完成多專案的部分類別,各專案本身當然也是可以繼續使用部分類別(partial)

問:為什麼要加回關聯?
答:因為在Model只要做一次,後面資料處理就可以很輕鬆,當然不加也是可以,只是資料處理還要做型態轉換,如果這個Model很多地方會使用,那光型態轉換就有得忙了

參考:
new和override的差異與目的
區分 abstract、virtual、override 和 new

沒有留言 :

張貼留言

Related Posts Plugin for WordPress, Blogger...