请假设必须上课,实现他们的接口:
public interface ICube
{
ICollection<IColor> sideColors {get; set; }
}
public interface IColor
{
float getHue ();
}
public class Cube : ICube
{
public ICollection<IColor> sideColors {get; set; }
}
public class Color : IColor
{
public Color (float r, float g, float b)
{
...
}
public float getHue ()
{
...
}
}
现在我想将接口暴露给另一个程序集,这个程序集必须对模型的实现一无所知。除此之外,我想使用该模型来使用CodeFirst定义数据库设计。在这种情况下,EF不能使用ICollection的定义,但需要像ICollection这样的定义。 满足这两个要求的最佳做法是什么: - 屏蔽Cube类的实现 - 使用EF
模型祝你好运, Teimo
答案 0 :(得分:1)
您的基本实体类不应实现或用作接口。
相反,它们应该是简单的POCO:
public class Cube
{
public ICollection<Color> sideColors {get; set; }
}
public class Color
{
public int SomeProperty {get; set;}
public Color(float r, float g, float b)
{
}
}
请注意,ICollection<Color>
对EF有效,但ICollection<IColor>
不是。
如果要在类之间共享属性,请使用Abstract Base Classes
而不是接口。
如果您希望某些人对基本实体执行某种操作和计算,请编写可以从接口继承的单独类
public class HandleColor : IHandleColor
{
public float getHue()
{
}
}
答案 1 :(得分:0)
如果使用“公共”修饰符标记接口,而使用“内部关键字”标记实现,则只有“接口”对另一个引用此接口的程序集可见。 例如
public interface ICube
{
ICollection<IColor> sideColors { get; set; }
}
public interface IColor
{
float getHue();
}
internal class Cube : ICube
{
public ICollection<IColor> sideColors { get; set; }
}
internal class Color : IColor
{
public Color(float r, float g, float b)
{
}
public float getHue()
{
}
}
除非我误解了你的要求