Come si progettano i suoi vari modelli di architettura / business?

0

Attualmente sto imparando i vari approcci alla progettazione di applicazioni e c'è una cosa che non riesco davvero a capire.

Diciamo che ho un dispositivo fisico nella mia rete, una telecamera di sorveglianza IP. Ho bisogno di un modello che rappresenti le "telecamere di sorveglianza IP" per lavorare con loro nella mia applicazione, che potrebbe apparire come questa:

public class IPCamera {

    public string     Token      { get; set; }
    public IPAddress  IPAddress  { get; set; }
    public string     RtspUri    { get; set; }

}

Ora, se voglio archiviare l'IPCamera in un database (ad esempio con Entity Framework), ho bisogno di forse altre proprietà e quindi un altro modello con:

   public int         Id         { get; set; }

Oh .. Voglio accedere alla mia applicazione tramite un servizio WCF. Non posso usare l'oggetto "Indirizzo IP" qui perché non è molto adatto alla serializzazione, quindi ho bisogno di un altro modello con una classe IP personalizzata che memorizzi l'indirizzo IP come stringa.

E per ultimo, un client Android vuole accedere ai miei dati. Progetto un'API RESTful utilizzando WebApi2. Il cliente non è interessato alle telecamere RTSPUri, ma vuole sapere dello stato attuale (è online, è offline).

Mi chiedo: come nominare tutti questi modelli che non entrano in conflitto? Devo progettare un modello per ogni scopo / livello / servizio? E come collegarli / mapparli? Con il modello dell'adattatore?

    
posta Acrotygma 17.01.2014 - 00:05
fonte

2 risposte

3

Now, if I want to store the IPCamera into a database (e.g. with Entity Framework), I need maybe another properties and thus, another model with...

No, hai solo bisogno di una proprietà ID nella classe IPCamera:

public class IPCamera {

    public int        ID         { get; set; }
    public string     Token      { get; set; }
    public IPAddress  IPAddress  { get; set; }
    public string     RtspUri    { get; set; }

}

I can't use the object "IPAddress" here because it's not very serialization friendly, hence I need another model ...

No, hai solo bisogno di un metodo ToString() nella tua classe IPAddress.

The client isn't interested in the cameras RTSPUri, but wants to know about the current state (is online, is offline).

Aggiungi un metodo isOnline() alla tua classe IPCamera?

    
risposta data 17.01.2014 - 00:43
fonte
0

Potresti usare l'ereditarietà come in

public class StateFullIPCamera : IPCamera {
  public bool isOnline { get; set; }
}

public class IPCamera : EntityBase {
  public string Token { get; set; }
  public IPAddess IPAddress { get; set; }
  ...
}

public class EntityBase {
  public int Id { get; set; }
}

Attenzione però, se ci sono proprietà nelle classi base di cui i client non hanno bisogno, dovresti restituirgli un modello diverso. Non inserire mai solo alcune proprietà.

Ho svalutato la risposta di Robert perché è semplice e sensata. Come ho commentato, vorrei suggerire un altro metodo API per ottenere lo stato della fotocamera e lasciarlo completamente fuori dal modello.

    
risposta data 17.01.2014 - 01:21
fonte