0

das ist meine Mutter abstrakte Klasse:Vererbung von Daten Annotationen von abstrakten Klasse zu Kind-Klasse von Schnittstelle?

public abstract class PersonViewModel:IPersonViewModel 
{ 
    #region DataValidatorModel 
    [Required(ErrorMessage = "ErrorInsertYourMobileNumber")] 
    [Display(Name = "MobileNumber")] 
    //--RegularExpression ========================(1234567890)===!(ValiAsr1) 
    [RegularExpression(pattern: @"(\d{10})", ErrorMessage = "ErrorNotFindMobileNumber")] 
    #endregion 
    public string MobileNumber { get; set; } 
    #region DataValidatorModel 
    [Required(ErrorMessage = "ErrorInsertPassword")] 
    [Display(Name = "Password")] 
    [DataType(DataType.Password)] 
    #endregion 
    public string Password { get; set; } 
    #region DataValidatorModel 
    [Required(ErrorMessage = "ErrorInsertReTypePassword")] 
    [Display(Name = "ReTypePassword")] 
    [DataType(DataType.Password)] 
    #endregion 
    public string ReTypePassword { get; set; } 
} 

Und das meine Schnittstelle:

public interface IPersonViewModel 
{ 
    string MobileNumber { get; set; } 
    string Password { get; set; } 
    string ReTypePassword { get; set; } 

} 

und Person Klasse:

public abstract class Person 
{ 
    #region MainProperties 

    public Guid PersonId { get; set; } 
    #region DataValidatorModel 
    [Required(ErrorMessage = "ErrorInsertYourFirstName")] 
    [Display(Name = "FirstName")] 
    [StringLength(15, MinimumLength = 2, ErrorMessage = "ErrorMin2Max15Words")] 
    [RegularExpression(pattern: @"(^[^-\s\d*]\D*$)", ErrorMessage = "ErrorNotAllowWhitspaceInFirstAndNumbers")] 
    #endregion 
    #region EFValidation 
    [Column(TypeName = "varchar(max)")] 
    #endregion 
    public string FirstName { get; set; } 

    #region DataValidatorModel 
    [Required(ErrorMessage = "ErrorInsertYourLastName")] 
    [Display(Name = "LastName")] 
    [StringLength(15, MinimumLength = 2, ErrorMessage = "ErrorMin2Max15Words")] 
    [RegularExpression(pattern: @"(^[^-\s\d*]\D*$)", ErrorMessage = "ErrorNotAllowWhitspaceInFirstAndNumbers")] 
    #endregion 
    #region EFValidation 
    [Column(TypeName = "varchar(max)")] 
    #endregion 
    public string LastName { get; set; } 

    #region DataValidatorModel 
    [Required] 
    [Display(Name = "Gender")] 
    #endregion 
    #region EFValidation 
    [Column(TypeName = "varchar(max)")] 
    #endregion 
    public string Gender { get; set; } 

    #region DataValidatorModel 
    [Required(ErrorMessage = "ErrorInsertYourProfileImage")] 
    [Display(Name = "ProfileImage")] 
    //--RegularExpression ========================(test.jpg)||(folder/test.jpg) 
    [RegularExpression(pattern: @"([^\s]+(\.(?i)(jpg|png|gif|bmp))$)", ErrorMessage = "ErrorItsNotImageFile")] 
    #endregion 
    #region EFValidation 
    [Column(TypeName = "varchar(max)")] 
    #endregion 
    public string ProfileImage { get; set; } 
    #endregion 

    public string FullName => $"{FirstName} {LastName}"; 
} 

Und das ist mein Kind Klasse:

public class UserViewModel:Person,IPersonViewModel 
{ 
    #region MainProperties 
    #region DataValidatorModel 
    [Display(Name ="Email")] 
    [DataType(DataType.EmailAddress)] 
    [RegularExpression(@"^([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$",ErrorMessage ="ErrorValidEmail")] 
    #endregion 
    public string Email { get; set; } 

    public string MobileNumber { get; set; } 

    public string Password { get; set; } 

    public string ReTypePassword { get; set; } 
    #endregion 
} 

Meine Frage ist, wie kann ich Datenanmerkungen an untergeordnete Klasse nach Schnittstelle erben?

Ich kann das nicht direkt ohne Schnittstelle tun, weil es offensichtlich Mehrfachvererbung ist.

Ist das ein guter Weg, das zu tun?

Gibt es einen alternativen Weg?

In der Tat möchte ich nicht mehr als einen Verweis auf Datenanmerkungen haben. Gibt es eine Möglichkeit, das zu tun?

+0

nicht neu definieren sie in der abgeleiteten Klasse, da sie in der Basisklasse nicht abstrakt sind. – juharr

+0

@juharr Es ist von der Schnittstelle geerbt und ich muss es implementieren! –

+0

Warte, was ist die 'Preson' Klasse. Sollte 'UserViewModel' nicht' PersonViewModel' erben? – juharr

Antwort

2

Die Eigenschaften, die von Ihrer Basisklasse geerbt werden, haben die Attribute, kein Problem.

Attribute, die in einer Schnittstelle definiert sind, werden nicht an Klassen übergeben, die diese Schnittstelle implementieren. Sie können das einfach nicht tun:

public interface IPersonViewModel 
{ 
    [Required] 
    string MobileNumber { get; set; } 
} 

public class PersonViewModel : IPersonViewModel 
{ 
    // this will NOT get the [Required] attribute from the interface 
    public string MobileNumber { get; set; } 
} 
+0

Ich denke, der beste Weg ist, das Person EF Modell von PersonViewModel zu trennen. Ist es wahr ? Ich meine, Trennung von Verantwortlichkeiten ist keine Duplikationseigenschaften und die Eigenschaften können wiederholt werden. Ist das richtig ? –

+0

@paradise_human Ich behaupte einfach, dass Anmerkungen zu Interfaces nicht auf die Klassen übertragen werden, die sie implementieren. Ich bin mir nicht sicher, wonach du suchst. Die Vervielfältigung von Eigenschaften findet viel zwischen den Ebenen statt. Die meisten Leute verwenden eine Lösung wie AutoMapper, um Werte zwischen ihnen abzubilden. –

Verwandte Themen