2016-12-04 6 views
1

У меня есть базовый класс сущностей, который вызывается двумя классами, называемыми Student и Department.C# передать дочерний объект методу, который должен быть заполнен общими свойствами базового класса

public abstract class Entity 
{ 
    [Key] 
    public string Id { get; set; } 
    [Required] 
    public DateTime Created { get; set; } 
    [Required] 
    public string CreatedBy { get; set; } 
    [Required] 
    public DateTime Modified { get; set; } 
    [Required] 
    public string ModifiedBy { get; set; }  
} 

public class Department : Entity 
{ 
    [Required] 
    [Index] 
    [StringLength(128)] 
    public string Name { get; set; } 

    public virtual ICollection<Student> Students { get; set; } 
} 

public class Student : Entity 
    { 
     [Required] 
     [Index] 
     [StringLength(128)] 
     public string Name { get; set; } 
     public string Phone { get; set; } 

     [Required] 
     public string DepartmentId { get; set; } 
     [ForeignKey("DepartmentId")] 
     public virtual Department Department { get; set; }   
    } 

Теперь я хочу, чтобы создавать экземпляры производных классов, но не хочу, чтобы дублировать общие коды инициализации. Я использовал ref out и т. Д., Но он получает ошибки сборки.

public Student CreateStudent() 
    { 
     Student student = new Student 
     { 
      Name = nameTextBox.Text, 
      Phone = phoneTextBox.Text, 
      DepartmentId = departmentComboBox.SelectedValue.ToString() 
     }; 
     SetCommonValues(ref student); 
     return student; 
    } 

    public Department CreateDepartment() 
    { 
     Department department=new Department() 
     { 
      Name = nameTextBox.Text 
     }; 
     SetCommonValues(ref department); 
     return department; 
    } 

    public void SetCommonValues(ref Entity entity) 
    { 
     entity.Id = Guid.NewGuid().ToString(); 
     entity.Created = DateTime.Now; 
     entity.Modified = DateTime.Now; 
     entity.CreatedBy = Constants.UserName; 
     entity.ModifiedBy = Constants.UserName;    
    } 

Любое предложение будет высоко оценено.

+0

Конструктор в абстрактном классе для работы SetCommonValues? –

+0

Можете ли вы предоставить более подробную информацию о том, как вы вызываете свой код и какие особенности об ошибках? – Vinod

ответ

1

решаемые с помощью метода расширения архитектуры

Модифицированный метод вызывающий

public Student CreateModel() 
    { 
     Student model = new Student 
     { 
      Name = nameTextBox.Text, 
      Phone = phoneTextBox.Text, 
      DepartmentId = departmentComboBox.SelectedValue.ToString(),     
     }; 
     model.SetCommonValues(); 
     return model; 
    } 

и метод SetCommonValues ​​является

public static Entity SetCommonValues(this Entity entity) 
    { 
     entity.Id = Guid.NewGuid().ToString(); 
     entity.Created = DateTime.Now; 
     entity.Modified = DateTime.Now; 
     entity.CreatedBy = Constants.UserName; 
     entity.ModifiedBy = Constants.UserName; 
     return entity; 
    } 

Я мог бы отметить метод расширения недействительным, но для расширяемости я возвращаюсь объект.

2

Возможно, у меня что-то не хватает. Есть ли какая-то особая причина, по которой вы не выбираете конструктор в абстрактном классе, например:

public abstract class Entity 
{ 
    public string Id { get; set; } 
    public DateTime Created { get; set; } 
    public string CreatedBy { get; set; } 
    public DateTime Modified { get; set; } 
    public string ModifiedBy { get; set; } 

    public Entity() 
    { 
     this.Id = Guid.NewGuid().ToString(); 
     this.Created = DateTime.UtcNow; 
     this.Modified = this.Created; 
    } 

    public Entity(string createdBy, string modifiedBy) : this() 
    { 
     this.CreatedBy = createdBy; 
     this.ModifiedBy = modifiedBy; 
    } 
} 

public class Department : Entity 
{ 
    public string Name { get; set; } 

    public virtual ICollection<Student> Students { get; set; } 
} 

public class Student : Entity 
{ 
    public string Name { get; set; } 
    public string Phone { get; set; } 

    public string DepartmentId { get; set; } 
    public virtual Department Department { get; set; } 
} 
+0

Не рекомендуется передавать созданные и измененные параметры здесь. просто подумайте о 1. сценарии веб-api (где модель автоматически связывается с помощью фреймворка) –

+0

2. В режиме редактирования u не должен передавать значения создания. –

+0

3. Я не должен принуждать детей передавать параметры –