一年以来我最好的创意
TypeBroker:收集與實(shí)體類型相關(guān)的元數(shù)據(jù)信息,包括反射信息和映射信息;
PropertyBroker:收集與實(shí)體類型的屬性相關(guān)的元數(shù)據(jù)信息,包括反射信息和映射信息。
這應(yīng)該是必須經(jīng)歷的一步,是整個(gè)環(huán)境上下文信息中最重要的一部分。
在業(yè)務(wù)層很難避免對(duì)實(shí)體元數(shù)據(jù)信息的操作,例如定位實(shí)體類或者定位實(shí)體屬性。
實(shí)體類型的問(wèn)題還比較好辦,畢竟在C#下可以使用typeof運(yùn)算符。實(shí)體屬性就比較麻煩了。
?
以往采用三種方式:
- 實(shí)體類型+屬性序號(hào),如:(typeof(Cat), 2)
- 實(shí)體類型+屬性名稱,如:(typeof(Cat), "Name")
- 屬性全名稱,如:("Cat.Name")
?
顯然,以上三種方式都不夠優(yōu)雅。
看看Hibernate如何處理:
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("name", "Fritz%") )
從Cat實(shí)體中檢索名稱含F(xiàn)ritz的實(shí)例集合,和我的方法二一樣。
注意到那個(gè)"name",不僅需要開(kāi)發(fā)者記住對(duì)Cat的name屬性的命名,而且還逃過(guò)了設(shè)計(jì)期的類型檢查,所有的錯(cuò)誤必須到運(yùn)行期才知道。
現(xiàn)在我在實(shí)體信息之外加了一個(gè)元數(shù)據(jù)詞典,解決了這個(gè)問(wèn)題。因?yàn)樗械膶?shí)體類型的源代碼都是工具生成的,所以再順便生成一個(gè)元數(shù)據(jù)詞典代價(jià)低廉。
具體實(shí)現(xiàn)是這樣的:
?
定義實(shí)現(xiàn)一個(gè)抽象類:Entity
為每個(gè)實(shí)體類都建立一個(gè)詞典類,繼承自Entity或者Entity的派生類,每個(gè)類都指向相應(yīng)的實(shí)體類型。例如名稱為Entity_User的類型指向User實(shí)體。
在每個(gè)嵌套類型中為對(duì)應(yīng)的實(shí)體類的每個(gè)屬性定義一個(gè)對(duì)應(yīng)的屬性,該屬性的名稱為對(duì)應(yīng)實(shí)體屬性的名稱,其值為對(duì)應(yīng)屬性的元數(shù)據(jù)。
在Entity類中為每個(gè)嵌套類定義一個(gè)私有的靜態(tài)實(shí)例,并通過(guò)只讀的靜態(tài)屬性暴露該靜態(tài)實(shí)例。
這是示例代碼:
{
????intern?Entity(Type?entityType)
????{
????????if?(entityType?!=?null)
????????{
????????????if?(typeof(BizObject).IsAssignableFrom(entityType))
????????????{
????????????????_Type?=?TypeBroker.Types[entityType];
????????????}
????????????else
????????????{
????????????????throw?new?ArgumentException("指定的類型不是實(shí)體類型",?"entityType");
????????????}
????????}
????????else
????????{
????????????throw?new?ArgumentException("尚未指定實(shí)體類型",?"entityType");
????????}
????}
????protected?TypeBroker?_Type;
????protected?PropertyBroker?PropertyOf(int?propertyindex)
????{
????????PropertyBrokerCollection?properties?=?_Type.Properties;
????????if?(properties.Count?>?propertyIndex?&&?0?<=?propertyIndex)
????????{
????????????return?properties[propertyIndex];
????????}
????????else
????????{
????????????throw?new?ArgumentException("指定的屬性序號(hào)無(wú)效",?"propertyIndex");
????????}
????}
????private?static?Entity_Pet?_Pet?=?new?Entity_Pet();
????
????public?static?Entity_Pet?Pet
????{
????????get
????????{
????????????return?_Pet;
????????}
????}
????private?static?Entity_Cat?_Cat?=?new?Entity_Cat();
????
????public?static?Entity_Cat?Cat
????{
????????get
????????{
????????????return?_Cat;
????????}
????}
????public?static?implicit?operator?TypeBroker(Entity?entity)
????{
????????return?entity._Type;
????}
}
public?class?Entity_Pet?:?Entity
{
????intern?Entity_Pet()?:?base(typeof(Pet))
????{
????}
????intern?Entity_Cat(Type?entityType)?:?base(entityType)
????{
????}
????public?PropertyBroker?ID
????{
????????get
????????{
????????????return?PropertyOf(typeof(Cat),?0);
????????}
????}
????public?PropertyBroker?Name
????{
????????get
????????{
????????????return?PropertyOf(typeof(Cat),?1);
????????}
????}
}
public?class?Entity_Cat?:?Entity_Pet
{
????intern?Entity_Cat()?:?base(typeof(Cat))
????{
????}
????public?PropertyBroker?Color
????{
????????get
????????{
????????????return?PropertyOf(typeof(Cat),?2);
????????}
????}
}以上示例代碼包含以下語(yǔ)義:
Entity.Pet表示寵物實(shí)體;Entity.Cat表示貓實(shí)體;
Entity.Pet.ID表示寵物的標(biāo)識(shí)屬性,Entity.Pet.Name表示寵物的名稱屬性;
Entity.Cat.ID表示貓的標(biāo)識(shí)屬性,Entity.Cat.Name表示貓的名稱屬性,Entity.Cat.Color表示貓的顏色屬性。
于是,以上Hibernate實(shí)現(xiàn)檢索的代碼在我這里變成這樣了:
StringConstraint.By(Entity.Cat.Name).Like("Frantz@")
在IDE環(huán)境下,敲入“Entity.”后會(huì)彈出所有實(shí)體類型名稱;敲入“Entity.Cat.”后會(huì)彈出Cat這個(gè)實(shí)體類型所有的屬性。如果你愿意在Entity的Cat靜態(tài)屬性上加上summary注釋,還會(huì)提示實(shí)體類型的概念名呢!
轉(zhuǎn)載于:https://www.cnblogs.com/Barton131420/articles/200476.html
總結(jié)
以上是生活随笔為你收集整理的一年以来我最好的创意的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 今天写了个Win32服务设置软件,呵呵,
- 下一篇: DataGrid中添加DropdownL