определяющий интерфейс - PullRequest
6 голосов
/ 18 января 2010

У меня есть модель данных, используемая несколькими приложениями, которую мне теперь нужно использовать другим разработчикам вне группы.Модель должна быть сделана только частично доступной для разработчиков.

Интересно, как мне лучше всего подойти к этому: мой текущий подход заключается в создании нового проекта, который просто копирует оригинальную модель и включает только запрошенные свойства.

например

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

В моей облегченной модели я хочу показать только скорость:

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

    }
}

Поскольку модель велика, это требует большого дублирования.Может быть, есть лучшая альтернатива?

Спасибо

Ответы [ 3 ]

2 голосов
/ 18 января 2010

Взгляните на работу Мартина Фаулера по Прикладным фасадам и Фасадному рисунку

2 голосов
/ 18 января 2010

Нет решения этой проблемы.Если разным разработчикам разрешено иметь только частичный доступ к полям, вам нужно будет создать разные каналы для разных разработчиков.


Хотя ваша модель мне просто кажется неправильной, вы можете сделать это следующим образом:

  • Создание одного объекта канала, который имеет все свойства, которыми обладает основной объект
  • Создайте некоторый атрибут, например:

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

  • Добавьте аннотации к свойствам канала, указав, кто имеет доступ к этому свойству, например [FeedSecurity("piet", "klaas")] string MyProperty { get;set; }
  • Заполните ваш объект канала автоматически из бизнес-объекта, используя несколько деревьев отражений и выражений, и проверьте, является ли пользовательимеет доступ к свойству, в противном случае игнорируйте его.
0 голосов
/ 18 января 2010

Вы можете посмотреть на использование нескольких интерфейсов

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

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

Или напишите все ваши базовые объекты как базовые классы. Унаследуйте от них, чтобы сделать полные классы, используя новую сборку. Предоставление разработчикам стороннего проекта может помочь решить только проблему с базовыми классами.

Сборка 1 (для других разработчиков)

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

    }         
}    

Сборка 2 (Полнофункциональная)

using ModelLite

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

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

Дайте сборку 1 другим разработчикам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...