Ho una soluzione divisa in due progetti: una libreria di classi contenente tutte le mie classi di modelli (chiamiamola Business ) e un progetto MVC ASP.Net.
Le mie classi Business sono pensate per essere generiche e funzionano per più tipi di progetti. Per questo motivo, non contengono alcuna annotazione dati / associazioni in altre classi, solo variabili membro / proprietà / costruttori .
Utilizzando l'approccio code-first, come dovrei progettare i miei modelli ASP.Net per lavorare con i miei modelli Business .
Il mio insegnamento iniziale stava impostando le mie classi Business come classi parziali e quindi sovrascrivo le mie proprietà aggiungendo le necessarie annotazioni di dati / associazioni . Non posso farlo perché abbiamo a che fare con due progetti separati.
Stavo anche pensando che potrei usare ereditarietà . I miei modelli ASP.Net potrebbero ereditare dalle classi Business e potrei aggiungere le mie annotazioni sui dati / associazioni . Questo sembra un po 'complicato e illogico, dato che dovrei definire tutti i miei costruttori in questa nuova sottoclasse.
C'è un modo intelligente per farlo in modo pulito?
EDIT:
Le mie classi Business hanno convalide generando eccezioni nei setter della proprietà. Il mio primo progetto è stato quello di creare la mia annotazione dati personalizzata che catturerà le eccezioni generate dai miei setter:
public class SetterBasedValidation : ValidationAttribute
{
string m_errorMessage = null;
public SetterBasedValidation(string errorMessage)
{
m_errorMessage = errorMessage;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
try
{
Type type = validationContext.ObjectType;
PropertyInfo property = type.GetProperty(validationContext.MemberName);
property.SetValue(validationContext.ObjectInstance, value);
}
catch (Exception)
{
return new ValidationResult(m_errorMessage);
}
return ValidationResult.Success;
}
}
Avrei quindi bisogno di un modo per usare la mia annotazione dati personalizzata nella mia classe di modello ASP.Net. Questo mi darebbe il risultato che voglio:
- Mantieni le mie classi aziendali generiche
- Utilizza le convalide dei miei setter
- Utilizza annotazioni di dati
EDIT 2:
Ecco una panoramica di base su come si presenta la mia soluzione. Le mie lezioni di business (modelli di dominio) contengono codice simile a questo:
public class User
{
private string m_name = null;
public string Name
{
get { return m_name; }
set
{
string name = value.Trim();
if (name.Length > 20 || name.Length < 1)
{
throw new ArgumentException("Name length invalid.");
}
m_name = name;
}
}
}