我有一个N层应用,UI,BLL和DAL。我的DAL使用EF6进行所有数据库交互。
这意味着,如果我查询数据库然后想要在我的UI中迭代对象(例如foreach循环以在屏幕上显示值),我的UI必须知道DAL。这似乎不正确。我希望我的DAL什么都不知道。 Bll可以知道DAL。用户界面只能知道BLL。
请考虑这个简化的EF对象
partial class Foo
{
public int Id { get; set; }
public virtual ICollection<Bar> FooFoo { get; set; }
}
我能想到的唯一方法是,如果我还有一个映射2个对象的Bll.Foo。然后我想,如果它们都实现了IFoo接口,那可能会更好。但是Foo有一个Bar of Collection,它也需要是IBar类型。这就是出错的地方。请考虑:
class Foo : IFoo //generated by EF
{
public int Id { get; set; } //generated by EF
public virtual ICollection<Bar> FooFoo { get; set; } //generated by EF and KABOOM
}
interface IFoo
{
ICollection<IBar> FooFoo { get; set; }
}
class Bar : IBar
{
public int MyPr
{ get; set; }
}
interface IBar
{
int MyPr { get; set; }
}
与上述干,我已经示出的KABOOM问题,是接口没有“满意”,因为它通过EF正值类型Bar
,但接口说我需要实现其作为型{ {1}}。没有这个,我不会脱钩......
我怎样才能实现这个目标,或者我的理解存在缺陷?
答案 0 :(得分:0)
关于创建模型和映射2的想法是将UI与DAL中的实体分开进行分离的合理方法。 你的BLL将有一个BLL.Foo来映射这两个对象。 你的BLL暴露BLL.Foo,以便它们可以被它上面的层使用。 这样只有BLL知道DAL实体。