2011-09-03 31 views
2

我不知道在哪裏/如何搜索這個問題,所以我認爲要求的最大打賭就是通過stackoverflow的comminuty。訪問類

基本上我正在設計一個項目,它將簡單地提供一個LINQ to SQL模型的邏輯項目訪問權限,以在數據庫上執行CRUD。所以數據的項目中我有LINQ到SQL模型類和C#類來提供訪問模型如下圖所示

public class Connection : IDisposable 
{ 
    private DataModelDataContext _model; 
    public DataModelDataContext model 
    { 
     get { return _model; } 
     set { throw new Exception("Object \"model\" is not allowed to be created outside of its container class", new NotSupportedException()); } 
    } 

    public Connection(string username, string password) 
    { 
     User u = _model.Users.Where(u => u.Username == username && u.password == u.Password); 

     if (u == null) 
      throw new ApplicationException("User credentials are invalid", new AuthenticationException()); 
     _model = new DataModelDataContext(); 
    } 

    public void refreshAndKeepChanges(object entity) 
    { 
     _model.Refresh(RefreshMode.OverwriteCurrentValues, entity); 
    } 

    public int getChangesCount() 
    { 
     return _model.GetChangeSet().Deletes.Count() + _model.GetChangeSet().Inserts.Count() + _model.GetChangeSet().Updates.Count(); 
    } 

    public void Dispose() 
    { 
     _model.SubmitChanges(); 
     _model.Dispose(); 
    } 
} 

我想,當我編譯DLL是邏輯的項目有訪問Connection類(上面)但不訪問DataModelDataContext(因爲這會打敗傳遞用戶憑據的對象)。我的問題是如何暴露連接類(作爲公衆,我已經完成),但隱藏從DLL的LINQ到SQL數據模型,但允許連接類訪問它?

對LINQ to SQL模型使用額外的命名空間不起作用,我發現添加DLL允許訪問項目中的所有命名空間。

+0

如果setter一直拋出異常,爲什麼不把它刪除呢?另外,你使用內部異常真的很奇怪。 InnerException的概念是描述產生異常的錯誤。如果你只是新增了兩個異常,那麼使用內部異常沒有任何意義。 – senfo

+0

我將更詳細地使用InneException,它只是還沒有實現,我只是使用setter中的異常代碼來顯示如果DLL的用戶嘗試設置_Model(Model)對象,我將拋出異常 –

回答

1

只需將model屬性與DataModelDataContext類(可能通過編輯設計器或手工編輯DBML)一起更改爲內部屬性。 Connection類對於內部類的瞭解很好 - 它不能公開地公開它們。

作爲一對夫婦的旁白:

  • 如果model二傳手是永遠不會成爲功能,爲什麼它呢?只是擺脫它。
  • 你應該開始跟隨.NET naming conventions
+0

邏輯項目將通過表示DataContext的連接類(通過模型)訪問_model屬性,我只是決定在setter上拋出一個用於安全性的異常,不知道如果不包括setter,則默認拋出異常。 –

+0

@MrsNezbit:我以爲你不希望Logic項目能夠訪問DataContext - 這就是爲什麼我說你應該在內部創建'model'。而刪除setter意味着代碼嘗試設置該值甚至不會編譯*,更不用說運行了。 –

+0

不可以。邏輯項目將有權訪問Connection類中的DataContext(_model)的實例,我想要阻止的是邏輯Project添加Data Project DLL並創建DataContext的實例以訪問Data沒有指定任何用戶憑證...這是否有意義?打字時我必須承認,我幾乎迷惑了自己。說使用DataContext上的內部而不是公共已經工作,所以這兩個答案解決了我的問題。謝謝 –

1

您更改public DataModelDataContext model要麼

internal DataModelDataContext model 

,如果你希望它是「該程序集內,而只是私人所有其他組件」

protected DataModelDataContext model 

private DataModelDataContext model 

如果您不想將DataModelDataContext暴露給該程序集中的其他類。

最有可能你想要它作爲internal

您可以搜索(或直接在MSDN上直接閱讀)的術語是Access Modifiers