6 Stimmen

Schnittstelle definieren

Ich habe ein Datenmodell, das von mehreren Anwendungen verwendet wird und nun auch von anderen Entwicklern außerhalb des Teams genutzt werden soll. Das Modell soll den Entwicklern nur teilweise zur Verfügung gestellt werden.

Ich frage mich, wie ich das am besten angehe: Mein derzeitiger Ansatz ist es, ein neues Projekt zu erstellen, das nur das ursprüngliche Modell kopiert und nur die gewünschten Eigenschaften enthält.

zum Beispiel

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

In meinem Lite-Modell möchte ich nur die Geschwindigkeit sichtbar machen:

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

    }
}

Da das Modell sehr groß ist, führt dies zu einer Menge Doppelarbeit. Vielleicht gibt es eine bessere Alternative?

感謝

2voto

Jan Jongboom Punkte 25470

Es gibt keine Lösung für dieses Problem. Wenn verschiedene Entwickler nur teilweisen Zugriff auf Felder haben dürfen, müssen Sie verschiedene Feeds für verschiedene Entwickler erstellen.


Auch wenn ich Ihr Modell für falsch halte, könnten Sie dies dennoch erreichen:

  • Erstellen eines Feed-Objekts, das alle Eigenschaften des Hauptobjekts besitzt
  • Erstellen Sie ein Attribut wie:

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

  • Fügen Sie Anmerkungen zu den Eigenschaften des Feeds hinzu, die angeben, wer Zugriff auf diese Eigenschaft hat, wie [FeedSecurity("piet", "klaas")] string MyProperty { get;set; }
  • Füllen Sie Ihr Feed-Objekt automatisch aus einem Geschäftsobjekt mit Hilfe einiger Reflexions- und Ausdrucksbäume, und prüfen Sie, ob der Benutzer Zugriff auf die Eigenschaft hat, andernfalls ignorieren Sie sie.

2voto

Stephan Eggermont Punkte 15743

Werfen Sie einen Blick auf die Arbeit von Martin Fowler auf Anwendung Fassaden und die Muster der Fassade

0voto

Nanook Punkte 2764

Möglicherweise können Sie mehrere Schnittstellen verwenden

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

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

Oder schreiben Sie alle Ihre Basic-Objekte als Basisklassen. Erben Sie von ihnen, um die vollständigen Klassen mit einer neuen Assembly zu erstellen. Wenn Sie den Entwicklern außerhalb des Projekts nur die Assembly mit den Basisklassen geben, könnte das Ihr Problem lösen.

Montage 1 (Für die anderen 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; }         
        }         

    }         
}    

Baugruppe 2 (Vollständig ausgestattet)

using ModelLite

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

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

Geben Sie nur Baugruppe 1 an die anderen Entwickler weiter.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X