C#OOPs架构问题

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对象)?

谢谢,

Mat*_*len 5

您不从一个类继承以添加新数据,只有在您的新类将扩展旧类的行为时才继承.

为UserDTO提供一个Name-Value集合来保存其数据并填充该数据.那你就不会有问题了.