C# 定义接口

C# 定义接口,c#,architecture,C#,Architecture,我有一个由多个应用程序使用的数据模型,我现在需要团队外的其他开发人员使用它。该模型只应部分提供给开发人员 我想知道如何才能最好地实现这一点:我目前的做法是创建一个新项目,只复制原始模型,只包含请求的属性 比如说 namespace Model { public class Car { private double m_speed; private FuelType m_fuelType; public double Speed

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

我想知道如何才能最好地实现这一点:我目前的做法是创建一个新项目,只复制原始模型,只包含请求的属性

比如说

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

    }
}
由于模型很大,因此需要大量重复。也许有更好的选择


谢谢,这个问题没有解决办法。如果不同的开发人员只允许部分访问字段,则需要为不同的开发人员创建不同的提要


虽然我觉得你的模型不对,但你可以通过以下方式实现:

  • 创建一个具有主对象也具有的所有属性的提要对象
  • 创建一些属性,如:


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

看看Martin Fowler在上的工作,您可能会看到使用多个接口

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

public interface ICar : ICarBasic
{
    FuelType FuelType { get; set; } 
}
或者将所有基本对象作为基类编写。从它们继承以使用新程序集生成完整的类。只给项目外的开发人员提供带有基类的程序集可能会解决您的问题

组件1(用于其他开发人员)

组件2(全功能)


仅将assembly 1提供给其他开发人员。

我认为应用程序Facades的链接应该是这基本上是Tarscher在他的第一篇文章中所说的。当你需要支持>X个不同的提要版本时,这是不可维护的。他两次执行速度。我的建议只有一次。从什么时候起继承就不可维护了?如果您有
类车{Model;Year;Fuel;}
并且想要公开
模型,那么继承就不可维护了;年份给一个人,
燃料;模型到另一个,以及
年份;燃料发送给其他人。
public interface ICarBasic
{
    double Speed { get; set; }
}

public interface ICar : ICarBasic
{
    FuelType FuelType { get; set; } 
}
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; }         
        }         

    }         
}    
using ModelLite

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

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