日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

一年以来我最好的创意

發(fā)布時(shí)間:2025/7/14 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一年以来我最好的创意 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
從Kanas.Net 1.0開(kāi)始,我對(duì)元數(shù)據(jù)的處理都是這樣的:
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í)例。
這是示例代碼:

public?abstract?class?Entity
{
????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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。