顶级班级实例

时间:2015-11-12 08:41:47

标签: c# oop layer

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

我从国际同事处收到的项目是在3层应用程序中构建的:

  • 数据层
  • GUI

到目前为止,事情是,在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;有一些问题,他没有工作。

谢谢,对不起,如果这个帖子变成重复的帖子,老实说,我甚至不确定要问什么。

2 个答案:

答案 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";