顶级类实例化

本文关键字:实例化 | 更新日期: 2023-09-27 18:21:33

我是OOP的新手,似乎每天都在艰难地学习。我和我的团队目前正在开发一个用C#Winforms开发的相当大的桌面应用程序。

我从我的国际同事那里收到的项目是一个3层应用程序:

  • 数据层
  • GUI

到目前为止,问题是在域层中,我有以下类。

-用户.cs-UserBase.cs

User.cs的结构是这样的:

/// <summary>
/// Top-level user class.
/// </summary>
public class User
{
    public User()
    {
        userBase = new UserBase();
    }
    public IAdmUser userBase { get; set; }
    public IEnumerable<IAdmGroup> AssGroups { get; set; }
}

UserBase.cs的结构是这样的:

public class UserBase:ObjectBase, IAdmUser
{
    /// <summary>
    /// The date that the user has been registered. The datetime is in UTC format. 
    /// </summary>
    public DateTime RegistrationDate { get; set; }
    /// <summary>
    /// 0 = User is not Active, 1 = User is Active.
    /// </summary>
    public bool IsActive { get; set; }
    /// <summary>
    /// The username.
    /// </summary>
    public string UserName { get; set; }
    /// <summary>
    /// Description of the user.
    /// </summary>
    public string Description { get; set; }
    /// <summary>
    /// Firstname of the user.
    /// </summary>
    public string FirstName { get; set; }
    /// <summary>
    /// Lastname of the user.
    /// </summary>
    public string LastName { get; set; }
}

每次我必须使用属性来填充User类型的新对象时,我都必须以以下方式实例化它:

 var newUser = new User
        {
            userBase =
            {
                FirstName = "name1",
                LastName = "name2",
                Description = "Junior Developer",
                IsActive = true,
                State = ObjectState.Added,
                RegistrationDate = DateTime.Now,
                UserName = "ASD"
            }
        };

// without object initializer
var newUser = new User()
newUser.userBase.PropertyName = "Assign property value"

所以基本上,如果我只执行:var user = new User(),我将无法访问字段FirstName, LastName等。我必须像newUser.userBase.PropertyName一样向下级别。

我不明白这个UserBase.cs是什么,我唯一有预感的是User.cs只是UserBase.cs的容器。

我在这里请求帮助,因为开发这个"框架"的同事有一些问题,他不在工作。

谢谢你,很抱歉,如果这会变成一个重复的帖子,老实说,我甚至不知道该问什么。

顶级类实例化

您的User类需要从UserBase继承,如下所示:

public class User : UserBase

之后,您可以从UserBase类访问"可继承"属性,就好像它们是User类的一部分一样。

因此,不设置:

User.UserBase.FirstName = "name1";

您可以使用:

User.FirstName = "name1";

这个框架的设计似乎考虑到了组合。意思是,User对象是由各种项组成的。

在DB层,可能有两个表:

  • 一个用于UserBase数据,其中包含有关用户及其帐户的信息
  • 一个用于IAdmGroup,它似乎是用户所属的组的集合

这两个信息可能都是作为一个对象从数据层进行整理和返回的,因为到一天结束时,Domain和GUI不关心它是如何存储的,因此基本上,User对象将具有用户信息以及它可能属于的任何组。

为了解决初始化问题,您可以查看Factory设计模式。这些模式的目的是抽象掉对象初始化,因此您只需传递一系列参数,就可以由工厂来初始化对象。

除了隐藏初始化细节外,这种模式还可以在对象初始化方面为您提供一定程度的灵活性,因为您可以插入不同的工厂,这些工厂可以初始化不同的对象。

因此,您的代码看起来像这样:

public static class UserFactory
{
    public static User CreateActiveJuniorDeveloper(string firstName, string lastName, string userName)
    {
         var newUser = new User
            {
                userBase =
                {
                    FirstName = firstName,
                    LastName = lasteName,
                    Description = "Junior Developer",
                    IsActive = true,
                    State = ObjectState.Added,
                    RegistrationDate = DateTime.Now,
                    UserName = userName
                }
                AssGroups = Enumerable.empty<IAdmGroup>();
            };
        return newUser;
    }
}
...
User developerUser = UserFactory.CreateActiveJuniorDeveloper("name1", "name2", "ASD");