2009-09-15 53 views
3

每個業務對象都有一個包含sql調用的匹配對象。我想限制這些sql對象的方式只能被匹配的業務對象使用。這怎麼能實現?使對象只能訪問同一個程序集中的另一個對象?

更新

格雷格提出了關於可測試性的地步。由於SqlObjects將包含特定於業務流程的sql,我不希望它們在多個buiness對象中重用。 (基本的CRUD操作都是由代碼生成的)有沒有辦法讓SqlObjects只能訪問業務程序集中的一個業務對象(如yshuditelu和Greg Beech展示的)並將SqlObjects公開給單元測試程序集?

回答

9

如果這是您想要或需要採取的方法,您可以在業務對象內創建sql對象私有類。

public class BusinessObject 
{ 
    private class SqlObject { } 
} 

此外,通過使用部分類,如果需要,可以將它分成單獨的文件。

//in one file 
public partial class BusinessObject 
{ 
    //business object implementation 
} 

//in another file 
public partial class BusinessObject 
{ 
    private class SqlObject { } 
} 

Joel使得一個好點在下面留言「中的SQLObject仍然可以從一個共同的類型繼承,對物像的連接信息可以通過這些共享‘內部’班」。這是絕對正確的,並且可能非常有益。

爲了響應您的編輯,單元測試只能測試公共類和函數(不使用測試中的反射)。我能想到的唯一的選擇會做到這一點:

  • 使每個業務/ SQL對象對
  • 改變private class SqlObjectinternal class SqlObject
  • 然後用[InternalsVisibleTo("UnitTestsAssembly")]該項目
一個組件

另外,在這一點上,你不必將sql對象保持爲嵌套類。一般來說,我認爲這可能會增加更多的複雜性,但我完全理解每種情況都是不同的,如果您的要求/期望將您推向了這一層,我希望您能順利。就我個人而言,我認爲我會將SqlObjects公開(或者內部可見內部用於單元測試),並接受這一事實,即這意味着sql類會暴露給所有業務類。

+3

另外:SqlObject仍然可以繼承一個通用類型,因爲連接信息可以通過這些「內部」類共享。 – 2009-09-15 14:19:07

+0

謝謝。我已經使用部分類來生成代碼。我正在分離依賴注入的SQL。您的方法只需要對我的模板進行很少的更改! – adam0101 2009-09-15 16:18:24

4

做的是使SQL對象的私人嵌套類型,即

public class BusinessObject 
{ 
    private class SqlObject 
    { 
    } 
} 

的唯一途徑這是否是從可測性觀點的一點是一個好主意是另一回事完全...

+0

這是關於可測試性的一個好處。有沒有辦法做到這一點,並將SqlObject類暴露給單元測試程序集,而不是其他業務對象? – adam0101 2009-09-16 13:08:07

0

您正在着手在C++中實現什麼是Friend類。據我所知C#和VB.Net沒有任何相同的東西。我唯一的建議是讓你希望限制需要訪問它的類的內部類的類。

0

您還可以使用兩個程序集(一個用於業務對象,另一個用於相關的SQL對象),並在每個SQL類上使用內部修飾符,然後使用[InternalsVisibleTo("BusinessObjectAssembly")]作爲SQLAssembly。