我在OOP上相当新,似乎每天我都在艰难地学习它。我和我的团队目前正在使用C#Winforms开发一个相当大的桌面应用程序。
我从国际同事处收到的项目是在3层应用程序中构建的:
到目前为止,事情是,在Domain Layer我有以下类。
-User.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"
}
};
OR
// 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
的容器。
我在这里请求帮助是因为开发了这个&#34;框架的同事&#34;有一些问题,他没有工作。
谢谢,对不起,如果这个帖子变成重复的帖子,老实说,我甚至不确定要问什么。
答案 0 :(得分:0)
看起来这个框架的设计考虑了构图。这意味着,User
对象是组成的各种项目。
在数据库层,可能就是你在某处有2个表:
UserBase
数据,其中包含有关用户及其帐户的信息。IAdmGroup
,它似乎是用户所属的组的集合。 这两个信息可能都是从数据层整理并作为单个对象返回的,因为在一天结束时,域和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");
答案 1 :(得分:0)
您的User类需要从UserBase继承,如下所示:
public class User : UserBase
在此之后,您可以访问“可继承的”&#39; UserBase类中的属性,就好像它们是User类的一部分。
所以不要设置:
User.UserBase.FirstName = "name1";
您可以使用:
User.FirstName = "name1";