2015-11-12 1 views
0

Я довольно новичок в ООП и кажусь повседневным, я изучаю его с трудом. Я и моя команда в настоящее время работают над довольно большим настольным приложением, созданным в C# Winforms.Мгновенное действие класса верхнего уровня

Проект я получил от моих зарубежных коллег структурирован приложением 3 слоя:

  • DataLayer
  • домена
  • GUI

До сих пор так хорошо, дело в том, что в доменном слое у меня есть следующие классы.

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

ИЛИ

// 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.

Я прошу помочь здесь, потому что у коллеги, который разработал эту «структуру», есть некоторые проблемы, и он не работает.

Спасибо, и сожалею, если это станет дубликат почты, честно говоря, я даже не уверен, что спросить.

+0

Он смотрит на меня, как если бы писатель не понимал наследование в C# слишком хорошо, когда первым написал этот код, или имел повод не позволять пользователю наследовать от userbase ... в любом случае вам придется подождать, пока ваш коллега не вернется на работу или не спросит окружающих вас людей – Sayse

+0

, если пользователь «является» базой пользователей. Используйте «User: UserBase». Если пользователь имеет «пользовательскую базу», ваша реализация должна быть в порядке. Может быть, вам нужен шаблон дизайна, который заполняет ваши свойства. –

+0

Наличие userBase = new UserBase() в конструкторе - довольно большая проблема. Это просто вздор, он ничего не конструирует. Архитектор, не появляющийся на работе, должен сильно беспокоить вас. Высокие шансы, что кто-то должен сказать «Стоп!». до того, как он превратится в катастрофу проекта. Мы не можем сказать это вам, поговорим с членами команды и руководителем. –

ответ

0

Казалось бы, этот каркас был разработан с учетом состава. Значение, что User объект составлен различных предметов.

В слое DB, это может быть, вероятно, в случае у вас есть 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"); 
0

Ваш класс Пользователь должен наследовать от UserBase, как это:

public class User : UserBase 

После этого, вы можете получить доступ к «наследственные» свойства из класса UserBase, как если бы они были частью класса User.

Так вместо того, чтобы установка:

User.UserBase.FirstName = "name1"; 

Вы можете использовать:

User.FirstName = "name1"; 
+0

Итак, я все еще борется с этим, и сегодняшний телефонный звонок с моим начальником был не очень хорошим. Он сказал, что архитектор не будет работать, по крайней мере, 2 недели. *Слезы радости*. – darksleep

+0

Вы пытались наследовать базовый класс, как я показал? –

+0

Пока нет. Но все сказали то же самое, что «Пользователь» должен наследовать от «UserBase». – darksleep

Смежные вопросы