2010-01-18 25 views
6

Tengo un modelo de datos utilizado por varias aplicaciones que ahora necesito que otros desarrolladores externos al equipo utilicen. El modelo solo debe estar parcialmente disponible para los desarrolladores.interfaz de definición

Me pregunto cuál es la mejor manera de abordar esto: mi enfoque actual es crear un proyecto nuevo que solo copie el modelo original y solo incluya las propiedades solicitadas.

por ejemplo

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; } 
     } 
    } 
} 

En mi modelo Lite sólo quiero exponer la velocidad:

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; } 
     } 

    } 
} 

Dado que el modelo es grande esto implica en un alto grado de duplicación. Tal vez hay una mejor alternativa?

Gracias

Respuesta

2

Tome un vistazo a la obra de Martin Fowler en Application Facades y la Facade Pattern

+0

Creo que el enlace para las fachadas de la aplicación debe ser http: // martinfowler.com/apsupp/appfacades.pdf – Kane

+0

Modificado. Gracias. –

2

No hay solución a este problema. Si los desarrolladores diferentes solo tienen acceso parcial a los campos, necesitarás crear diferentes feeds para diferentes desarrolladores.


Aunque su modelo sólo parece mal a mí, es posible que sin embargo lograr esto mediante:

  • Creación de un objeto de alimentación que tiene todas las propiedades del objeto principal también tiene
  • crear algún atributo como :

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

  • Añadir anotaciones sobre las propiedades de la alimentación especificar quién tiene acceso a esta propiedad como [FeedSecurity("piet", "klaas")] string MyProperty { get;set; }
  • Llene su objeto feed de un objeto de negocio de forma automática utilizando unos árboles de reflexión y de expresión, y comprobar si el usuario tiene acceso a la propiedad, de lo contrario ignórelo.
0

Usted podría Puede haber contemplar la utilización de múltiples interfaces

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

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

O Escribir todo el objeto básico como clases base. Heredar de ellos para hacer las clases completas usando un nuevo ensamblaje. Dar a los desarrolladores al lado del proyecto, solo el ensamblaje con las clases base podría resolver el problema.

Asamblea 1 (Para el otro 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; }   
     }   

    }   
}  

Asamblea 2 (todas las funciones)

using ModelLite 

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

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

sólo dan montaje 1 a los otros desarrolladores.

+0

Esto es básicamente lo que dice Tarscher en su primera publicación. Esto no se puede mantener cuando deba admitir esto para> X diferentes versiones de fuentes. –

+0

La publicación original era al revés. Estaba implementando velocidad dos veces. Mi sugerencia solo lo tiene una vez. ¿Y desde cuándo la Heredad no se ha podido mantener? – Nanook

+0

No se puede mantener si tiene 'class Car {Model; Año; Combustible; } 'y desea exponer' Modelo; Año; 'a una persona,' Combustible; Modelo; 'a otro, y' Año; Combustible; 'a otra persona. –

Cuestiones relacionadas