Rag*_*hav 2 c# architecture oop
在尝试使我的架构灵活时,我面临着一个类解决问题.为简单起见,请考虑以下示例:
我有四个层:UI,BL,Common和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;
}
}
Run Code Online (Sandbox Code Playgroud)
DTO定义为:
public class UserDTO
{
public int ID;
public UserDTO()
{
}
public UserDTO(UserDTO source)
{
ID = source.ID;
}
}
Run Code Online (Sandbox Code Playgroud)
我的DAL定义为(它返回DTO而不是业务对象):
public static UserDTO GetUser()
{
UserDTO dto = new UserDTO();
dto.ID = 99;
return dto;
}
Run Code Online (Sandbox Code Playgroud)
现在,我想"扩展"我的代码,以便我可以在我的User表中再添加一个字段:Name.所以我创建了一个派生的DTO类:
public class MyUserDTO : UserDTO
{
public string Name;
public MyUserDTO()
{
}
public MyUserDTO(MyUserDTO source)
{
Name = source.Name; //new field
base.ID = source.ID;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,我创建一个派生的User类,如下所示:
public class MyUser : User
{
public MyUser()
{
this.D = new MyUserDTO();
}
}
Run Code Online (Sandbox Code Playgroud)
我使用此方法创建自己的自定义DAL提供程序:
public static UserDTO GetUser()
{
UserDTO dto = new MyUserDTO();
dto.ID = 99;
((MyUserDTO)dto).Name = "New Provider Name";
return dto;
}
Run Code Online (Sandbox Code Playgroud)
现在,当我在BL中访问此MyUserDTO对象时,它会失去解决方案:
User.GetUser(DAL.Provider.GetUser())
在UI中,我没有得到MyUserDTO中的属性.
是否有一种方法可以帮助我在UI层中获取这些属性,即使我调用静态User.GetUser()方法(它将调用我的自定义提供程序返回MyUserDTO对象)?
谢谢,