2011-07-17 65 views
2

L2SQL使用默認的無參數構造函數生成實體。這是不能改變的,因爲它需要物化對象。LINQ2SQL實體構造函數約束

但是,如果我的對象只能創建與某些值初始化我將如何去隱藏無參數構造函數,以便消費者只看到一個構造函數的參數?

1)我可以創建另一個同名部分類,並添加我的新構造函數,但消費者現在只需要兩個選項來創建我的類的實例。無參數的構造函數仍然可見。

2)使用接口。創建一個定義構造函數的接口是不可能的。

人們怎麼看待這個問題,因爲它看起來像一個會發生很多問題。

+0

另一種情況是,提供的用於linq-to-sql的代碼生成工具無法承受L2S的真正威力。真的感覺微軟希望每個人都離開L2S。 –

回答

1

如果我理解你正確,你想阻止其他用戶從類的構造函數構造一個,但仍然允許Linq2SQL使用它(因爲它必須這樣做)。

幸運的是,當你說默認的無參數構造函數不能被改變時,你錯了。如果您將Linq2SQL實體類的構造函數更改爲private,那麼Linq2SQL將使用反射來調用它,如果使用了反射,則可以調用私有構造函數。 (順便說一句,對構造函數的其他更改也可以使用Linq2SQL完成)。

當然,該類的其他用戶也可以使用反射來調用該私有構造函數並創建一個私有狀態的類,但是所有.NET類都是如此(事實上在其他地方也適用 - 例如,它通常不是很難篡改C++類的隱私,儘管這兩種方法都沒有獨立於實現的保證)。但是,然後幾乎總是可以使用反射來混淆課程;封裝是一種確保正確性的機制,而不是安全性。 (但是關於哪些代碼可以使用反射的安全限制,然後在較少的保證之上構建安全性)。

+0

是否有可能將由圖形化ORM設計器或SqlMetal生成的默認ctor更改爲私有,還是需要手動編碼實體類? –

+0

我從來沒有用過它們,所以我不知道。你當然可以用它們作爲起點,然後手動編輯輸出。缺點是你不能再從它們重建,但是如果你讓這些類對其他代碼可見,那麼無論如何你都不能從它們重新編譯,因爲這可能導致破壞其他代碼的工作。 –

+0

這對Jon很有幫助。我從來沒有想過改變L2S生成實體的訪問修飾符,因爲我認爲L2S已經設置了它需要執行其底層操作所需的那些實體的可訪問級別。 L2S產生的評論讓我不得不改變!即/ /更改此文件可能會導致不正確的行爲,如果代碼重新生成將丟失。 - 再生我可以應付。歡呼聲 – FuzzyFrog