2010-01-18 11 views
6

Ho una datamodel utilizzata da più applicazioni che ora deve essere utilizzata da altri sviluppatori esterni al team. Il modello dovrebbe essere reso solo parzialmente disponibile per gli sviluppatori.definizione interfaccia

Mi chiedo come mi avvicini di più a questo: il mio attuale approccio è quello di creare un nuovo progetto che copia solo il modello originale e include solo le proprietà richieste.

ad esempio

namespace Model 
{ 
    public class Car 
    { 
     private double m_speed; 
     private FuelType m_fuelType; 

     public double Speed 
     { 
      get { return m_speed; } 
      set { m_speed = value; } 
     }  


     public FuelType FuelType 
     { 
      get { return m_fuelType; } 
      set { m_fuelType = value; } 
     } 
    } 
} 

Nel mio Lite Model voglio solo esporre la velocità:

using Model; 

namespace ModelLite 
{ 
    public class Car 
    { 
     private Model.Car car = new Model.Car(); 

     public double Speed 
     { 
      get { return this.car.Speed; } 
      set { this.car.Speed = value; } 
     } 

    } 
} 

Poiché il modello è grande questo comporta in un sacco di duplicazione. Forse c'è un'alternativa migliore?

Grazie

risposta

2

Date un'occhiata al lavoro di Martin Fowler sulla Application Facades e Facade Pattern

+0

Penso che il collegamento per le facciate dell'applicazione dovrebbe essere http: // martinfowler.com/apsupp/appfacades.pdf – Kane

+0

Modificato. Grazie. –

2

Non c'è una soluzione a questo problema. Se a diversi sviluppatori è consentito solo l'accesso parziale ai campi, sarà necessario creare feed diversi per diversi sviluppatori.


Anche se il vostro modello sembra solo sbagliato per me, si potrebbe comunque ottenere questo risultato:

  • Creazione di un oggetto feed che ha tutte le proprietà dell'oggetto principale ha anche
  • creare qualche attributo come :

class FeedSecurityAttribute : Attribute 
{ 
     public FeedSecurityAttribute(params string[] rights) {} 
} 

  • Aggiungi annotazioni sulle proprietà dei mangimi specificando chi ha accesso a questa proprietà come [FeedSecurity("piet", "klaas")] string MyProperty { get;set; }
  • Riempi il tuo oggetto feed da un oggetto di business utilizzando automaticamente alcuni alberi di riflessione e di espressione, e controllare se l'utente ha accesso alla proprietà, altrimenti ignorarlo.
0

Si potrebbe potrebbe essere guardare con più interfacce

public interface ICarBasic 
{ 
    double Speed { get; set; } 
} 

public interface ICar : ICarBasic 
{ 
    FuelType FuelType { get; set; } 
} 

o scrivere tutti i vostri oggetti di base come classi di base. Eredita da loro per rendere le classi complete utilizzando un nuovo assembly. Dando agli sviluppatori il progetto, solo l'assembly con le classi base potrebbe risolvere il problema.

Assembly 1 (Per l'altra Devs)

using Model;   

namespace ModelLite   
{   
    public class Car   
    {   
     private Model.Car car = new Model.Car();   

     public double Speed   
     {   
      get { return this.car.Speed; }   
      set { this.car.Speed = value; }   
     }   

    }   
}  

Assemblea 2 (completamente descritto)

using ModelLite 

namespace Model   
{   
    public class Car : ModelLite.Car   
    {   
     private FuelType m_fuelType;   

     public FuelType FuelType   
     {   
      get { return m_fuelType; }   
      set { m_fuelType = value; }   
     }   
    }   
}  

dare solo il montaggio 1 agli altri sviluppatori.

+0

Questo è fondamentalmente ciò che dice Tarscher nel suo primo post. Questo non è possibile quando dovrai supportare questo> per X versioni di feed diverse. –

+0

Il post originale era il contrario. Stava implementando la velocità due volte. Il mio suggerimento ha solo una volta. E da quando in poi l'Eredità è stata irraggiungibile? – Nanook

+0

Non è possibile tenerlo se si dispone di 'class Car {Model; Anno; Carburante; } 'e voglio esporre' Modello; Anno; 'a una persona,' Carburante; Modello; 'a un altro, e' Anno; Carburante; 'a qualcun altro. –

Problemi correlati