顶级类实例化
本文关键字:实例化 | 更新日期: 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");