0

请假设必须类,实现它们的接口:

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 模型

最好的问候, 泰莫

4

2 回答 2

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()
    { 
    }
}
于 2013-06-13T16:00:56.967 回答
0

如果您使用 Public 修饰符标记接口并使用 Internal 关键字标记实现,则只有该接口对引用该接口的另一个程序集可见。例如

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

}

除非我误解了你的要求

于 2013-06-13T14:59:58.363 回答