代码优先 - 如何从多个类创建一个具有相互关系的接口?

时间:2013-06-13 13:36:46

标签: c# entity-framework interface ef-code-first entity-framework-5

请假设必须上课,实现他们的接口:

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

2 个答案:

答案 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()
    { 
    }

}

除非我误解了你的要求