【问题标题】:C# OOPs architecture problemC# OOPs 架构问题
【发布时间】:2010-12-18 08:30:07
【问题描述】:

在尝试使我的架构灵活时,我遇到了类解析问题。为简单起见,请考虑以下示例:

我有四层: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;            
        }
    }

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;
    }
}

然后,我创建一个派生的 User 类:

 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.GetUser())

在 UI 中,我没有获得 MyUserDTO 中的属性。

是否有一种方法可以帮助我在 UI 层中获取这些属性,即使在我调用静态 User.GetUser() 方法(这反过来又会调用返回 MyUserDTO 对象的自定义提供程序)之后?

谢谢,

【问题讨论】:

    标签: c# oop architecture


    【解决方案1】:

    您不会从一个类继承来添加新数据,只有在您的新类要扩展旧类的行为时才继承。

    给你的 UserDTO 一个 Name-Value 集合来保存它的数据并填充它。那么你就不会有问题了。

    【讨论】:

      【解决方案2】:

      您没有得到派生行为,因为用户类中的静态方法不能被 MyUser 类覆盖。

      您应该删除静态方法(我知道您已经表示不能),但实际上您应该这样做。

      尝试在另一个对象(工厂、存储库、...)中提取用户的创建

      【讨论】:

        【解决方案3】:

        正如其他人所提到的,问题出在静态方法上。

        我还建议使用泛型或依赖注入来清理您的并行对象层次结构。你不想要这种重复。

        不要拥有一组几乎相同的“User”和“MyUser”类,它们具有相同的层次结构,只需执行类似于 User 的操作并插入您想要的 UserDTO 类型。

        如果重构并删除对象层次结构重复,可能会更容易找到解决静态 GetUser() 问题的好解决方案。

        【讨论】:

          【解决方案4】:

          据我所见,看起来 User.GetUser() 将返回一个 User 对象,而不是 MyUserDTO 对象,这就是您没有获得这些额外字段的原因。 DAL 层需要遵守它所针对的合同。有几种方法可以解决这个问题,尽管有些方法比其他方法更“正确”。

          您可以将您从 User.GetUser 中获得的对象转换为适当的对象,然后您可以访问被转换对象的字段(假设对象可以转换为该类型)。从设计的角度来看,我不太喜欢这种解决方案,但它会起作用:

          MyDTOUser myDtoUser = User.GetUser() as MyDTOUser;
          

          其他人已经发布了一些其他方法的例子,所以我不会在这里重复。

          【讨论】:

            猜你喜欢
            • 2011-03-24
            • 1970-01-01
            • 2010-10-12
            • 2015-05-23
            • 2011-06-11
            • 2021-08-12
            • 1970-01-01
            • 2011-02-14
            • 2012-11-25
            相关资源
            最近更新 更多