定义界面

时间:2010-01-18 10:39:34

标签: c# architecture

我有一个由多个应用程序使用的数据模型,我现在需要由团队之外的其他开发人员使用。该模型应仅供开发人员使用。

我想知道我最好如何做到这一点:我目前的方法是创建一个只复制原始模型的新项目,并且只包含所请求的属性。

例如

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

在我的Lite模型中,我只想暴露速度:

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 个答案:

答案 0 :(得分:2)

此问题无法解决。如果只允许不同的开发者部分访问字段,则需要为不同的开发人员创建不同的提要。


虽然您的模型对我来说似乎不对,但您可以通过以下方式实现此目的:

  • 创建一个包含主对象所有属性的供稿对象
  • 创建一些属性,如:

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

  • 在Feed的属性上添加注释,指定谁有权访问此属性,例如[FeedSecurity("piet", "klaas")] string MyProperty { get;set; }
  • 使用一些反射和表达式树自动从业务对象填充您的Feed对象,并检查用户是否有权访问该属性,否则忽略它。

答案 1 :(得分:2)

看看Martin Fowler在Application FacadesFacade Pattern

上的工作

答案 2 :(得分:0)

你可能会看到使用多个接口

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

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

或者将所有Basic对象编写为基类。继承它们以使用新程序集创建完整的类。将开发人员放在项目的一边,只有具有基类的程序集可以解决您的问题。

组装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提供给其他开发人员。