【求助】小系統(tǒng)組成大系統(tǒng)所遇到的問(wèn)題
以下只是舉例!
環(huán)境:
1,通用實(shí)體庫(kù)CommonEntity,里面有管理員類(lèi)
class Administrator<TEntity> : Entity<TEntity>, IAdministrator where TEntity:Administrator<TEntity>{
static TEntity Login(String username, String password);
static IAdministator FindByID(Int32 id);
static IAdministator FindByName(String name);
}
這是一個(gè)泛型類(lèi),然后有個(gè)默認(rèn)的管理員類(lèi)
class Administrator:Administrator<Administrator>{}
可別暈了,尖括號(hào)里面的Administrator就是左邊的那個(gè)類(lèi),而尖括號(hào)前那個(gè),是上面那個(gè)泛型類(lèi)。上面可以看到,我們還有一個(gè)IAdministator接口。
2,請(qǐng)假模塊。業(yè)務(wù)邏輯部分針對(duì)IAdministrator編程,因?yàn)椴恢雷罱K類(lèi)型,沒(méi)辦法利用Administrator<TEntity>進(jìn)行編碼。
3,出差模塊。同上,只對(duì)IAdministator進(jìn)行編碼。
4,最終項(xiàng)目。它要擴(kuò)展管理員類(lèi),于是有
class Admin:Administrator<Admin>{
public String Address{get;set;}
}
這個(gè)擴(kuò)展的管理員類(lèi),多了一個(gè)地址Address字段。
這個(gè)時(shí)候,需要把請(qǐng)假模塊和出差模塊集成進(jìn)來(lái),而這兩個(gè)模塊,根本不需要關(guān)心擴(kuò)展的Address字段,因?yàn)樗鼈冎恍枰玫交?lèi)里面的那些字段和方法就足夠了,但是那兩個(gè)模塊里面用的是IAdministator接口所代表的對(duì)象,必須是最終擴(kuò)展的這個(gè)Admin類(lèi),而不是通用實(shí)體庫(kù)CommonEntity里面的Administrator,否則會(huì)出很大的問(wèn)題,例如它們倆是不同的數(shù)據(jù)表。
現(xiàn)狀:
1,目前采用的方法。請(qǐng)假和出差模塊使用Administrator類(lèi)(不是泛型那個(gè)),如IAdministator admin=Administrator.FindByID(123)。這個(gè)FindByID里面,讀取配置文件,得知真正的管理員類(lèi)是Admin,然后反射調(diào)用它的方法,所以最終得到的admin實(shí)際上是Admin的實(shí)例,而不是Administator的。
2,上面的方法解決了問(wèn)題,但是還有很多問(wèn)題。管理員類(lèi)只是一個(gè)例子,還有很多其它的類(lèi)需要這樣做,都這樣子使用配置,最后統(tǒng)一起來(lái),就會(huì)奇臭無(wú)比。
3,假如還有一個(gè)模塊,考勤模塊,需要用到請(qǐng)假和出差,然后它又要擴(kuò)展請(qǐng)假和出差……(你懂的!)
求助:
求一個(gè)漂亮的解決方案!

浙公網(wǎng)安備 33010602011771號(hào)