2009-11-19 78 views
2

我在嘗試使我的體系結構具有靈活性時面臨類解決問題。爲簡單起見,考慮下面的例子:C#OOP體系結構問題

我有四個層次:用戶界面,BL,普通和DAL

我有我的BL層基類,定義如下:

public class User 
    { 
     private UserDTO _d; 
     public User() 
     { 
      _d = new UserDTO(); 
     } 
     public User(UserDTO d) 
     { 
      _d = new UserDTO(d); 
     } 
     public UserDTO D 
     { 
      get { return _d; } 
      set { _d = value; } 
     } 

     //static method (I cannot make it non-static due to some reasons) 
     public static User GetUser() 
     { 
      User user = new User(Provider.DAL.GetUser()); 
      return user;    
     } 
    } 

該DTO定義爲:

public class UserDTO 
    { 
     public int ID; 
     public UserDTO() 
     { 
     } 

     public UserDTO(UserDTO source) 
     { 
      ID = source.ID; 
     } 
    } 

我DAL被定義爲(它返回一個DTO不是一個業務對象):

public static UserDTO GetUser() 
     { 
      UserDTO dto = new UserDTO(); 
      dto.ID = 99; 
      return dto; 
     } 

現在,我想「擴展」我的代碼,這樣我可以在我的用戶表中有一個字段:名稱。所以,我創建一個派生DTO類爲:

public class MyUserDTO : UserDTO 
    { 
    public string Name; 
    public MyUserDTO() 
    { 
    } 

    public MyUserDTO(MyUserDTO source) 
    { 
     Name = source.Name; //new field 
     base.ID = source.ID; 
    } 
} 

然後,我創建了一個派生用戶類爲:

public class MyUser : User 
    { 
     public MyUser() 
     { 
      this.D = new MyUserDTO(); 
     } 
    } 

我創建這個方法我自己的自定義DAL提供商:

public static UserDTO GetUser() 
     { 
      UserDTO dto = new MyUserDTO(); 
      dto.ID = 99; 
      ((MyUserDTO)dto).Name = "New Provider Name"; 
      return dto; 
     } 

現在,當我訪問我的BL中的MyUserDTO對象時,它失去了分辨率:

User.GetUser(DAL.Provider.GetUs呃())

在UI中,我沒有得到MyUserDTO中的屬性。

即使在我調用靜態User.GetUser()方法(這又會調用我的自定義提供程序返回MyUserDTO對象)之後,是否有方法可以幫助我獲取UI層中的這些屬性?

感謝,

回答

5

你不從繼承類中添加新的數據,只有當你的新類是要延長你的舊類的行爲繼承。

給你的UserDTO一個Name-Value集合來存放它的數據並填充它。那麼你不會有問題。

1

您沒有得到派生的行爲,因爲用戶類中的靜態方法不能被MyUser類重寫。

你應該刪除靜態方法(我知道你已經表示你不能),但你真的應該。

嘗試提取用戶的創建另一個對象(工廠,倉庫,...)

0

從我看到它看起來像User.GetUser()將返回用戶對象,而不是MyUserDTO對象,這就是爲什麼你沒有得到這些額外的領域。 DAL層需要遵守所寫的合同。有幾種方法可以解決這個問題,儘管有些方法比其他方法更「正確」。

您可以將您從User.GetUser中獲取的對象轉換爲適當的對象,然後該對象將允許您訪問鑄造對象的字段(假定該對象可以轉換爲該類型)。我真的不喜歡從設計的角度來看這個解決方案,但它的工作:

MyDTOUser myDtoUser = User.GetUser() as MyDTOUser; 

其他人已經張貼的方式其他一些例子解決此所以我就不再重複那些在這裏。

1

正如其他人所說的,問題在於靜態方法。

我也建議使用泛型或依賴注入來清理你的並行對象層次結構。你不希望重複。

而是具有一組幾乎相同的「用戶」和「MYUSER」類,即具有相同的層次,只是做一些這樣的用戶,並插入所需的UserDTO類型。

如果您重構並刪除對象層次結構重複,可能會更容易發現解決靜態GetUser()問題的良好解決方案。