Organizzazione di entità aziendali e di presentazione

0

Sfondo

Sto sviluppando un progetto WPF.

Questa è la struttura di base:

  • Interfaccia utente (progetto WPF);
  • Interfacce (libreria di classi, contiene tutte le interfacce e le entità utilizzate dall'applicazione;
  • Moduli (ogni modulo contiene la logica di un argomento specifico, ad esempio Gestione file, e può eventualmente contenere controlli utente Wpf).

Nei controlli WPF, per facilitare le operazioni di associazione ho creato una classe BaseViewModel che contiene un metodo Raise che automatizza il meccanismo di binding (per ulteriori dettagli, ho usato una tecnica simile a quella descritta in questo article ).

Il problema

Comprendi quale è il modo migliore per separare il modulo di presentazione dal modulo aziendale nelle classi di entità.

Il caso

Nel progetto Interfacce ho, ad esempio, la classe User

public class User
{
    public virtual string Name { get; set; }

    // Other properties
}

In uno dei moduli ho bisogno di usare la classe User e di associare le sue proprietà ai controlli dell'interfaccia utente. Per farlo, devo utilizzare un'implementazione personalizzata delle parole chiave get e set .

Al primo punto, ho pensato di creare una classe nel modulo chiamata, ad esempio, ClientUser e sovrascrivere le proprietà di cui ho bisogno:

public class ClientUser : User 
{
    private string name;

    public override string Name { get { return name; } set { Raise(out name, value); } }

    // Other properties
}

Il problema è il metodo Raise, che è dichiarato nella classe BaseViewModel , ma a causa del vincolo di ereditarietà C #, non posso ereditare da entrambe le classi.

Qual è il modo giusto per implementare questa architettura?

    
posta simoneL 23.07.2014 - 00:05
fonte

1 risposta

1

Usa interfacce

public interface IUser
{
    string Name { get; set;}
}

E ora puoi avere due implementazioni,

public class User : IUser
{
    public string Name { get; set; }
}

e

public class ClientUser : BaseViewModel, IUser
{
   private string _name;
   public string Name
   {
       get
       {
           return _name;
       } 
       set
       {
          Raise(out _name, value); 
       }
   }

}

Come effetto collaterale positivo, ti sei liberato del virtuale.

Se il tuo utente cliente è semplicemente un viewmodel per un'entità utente (che sembra essere), molto probabilmente desideri un design diverso. Dato IUser e User di sopra, dovresti scrivere una classe viewmodel:

public UserViewModel : BaseViewModel
{
    private readonly IUser _user;
    UserViewModel(IUser user)
    {
        _user = user;
    }

    public string Name
    {
       get
       {
           return _user.Name;
       } 
       set
       {
          _user.Name = value;
          Raise(out _name, value); 
       }
   }

}
    
risposta data 23.07.2014 - 12:13
fonte

Leggi altre domande sui tag