根据此处提出的设计MVC3 and Entity Framework,我尝试使用MVC4 + EntitiFramework5为DAL,BL和Web创建不同的图层。
引自@Davide Piras
1 - ProjectName.Interfaces(类库,实体的接口);
2 - ProjectName.DAL(类库,唯一允许使用EF的人,POCO实体使用另一个文件实现项目1的接口,您使用部分类重新声明相同的对象...); < / p>
3 - ProjectName.BL(类库,业务逻辑,引用上面1和2的两个项目);
4 - ProjectName.Web(ASP.NET MVC应用程序,表示层,引用两个项目1和3但不是2);
我对BL和DAL之间的联系存有疑问。 DAL知道EF,BL shoudln&#39;但是如何实现呢?我的意思是,我在两个层上创建了代表我的entitis的类(这对我来说似乎有点重复......即使在BL中我会添加验证和其他sutff),但是我如何公开数据库值BL?
在默认的MVC4解决方案中我有
DbSet<Entity> entity
我可以查询(.Find等)..我想我需要在我的BL中映射它们(IQueryable?IEnumerable?Isomething ??)
完全混淆..任何帮助都是欣赏
答案 0 :(得分:3)
当您谈到DAL和EF时,线条会变得有点模糊。在某些情况下,你could consider EF the DAL。但是我通常没有BL直接访问EF并将其抽象到更高级别,因此如果需要,您可以轻松地将EF替换为ORM。我使用Repository Design Pattern来进一步抽象EF。这种模式的另一个优点是它使单元测试更容易,你可以使用依赖注入。我还使用Unit of Work Design Pattern来处理系统中的事务。 DAL的存储库和工作单元也是如此,或者它只是EF。这可能是有争议的,我知道自己更长时间关注尝试定义DAL。以下是我建议在MVC 4项目中使用的图层。
应用程序或域层是您的BL层。我倾向于在这一层中加入Service Layer中使用的概念,因为我还没有看到将它分离出来的任何好处。但也可以选择在顶部添加此图层。
答案 1 :(得分:1)
不,业务逻辑层需要了解DAL,因为它需要调用DAL上的方法才能检索/更新/添加数据(仅使用接口,不应该让它看到POCO课程)。 BL对EF一无所知(因为它应该如此,因为你曾经想用其他东西替换EF)。
因此,例如添加新记录:
Web项目调用BL层中的AddItems(使用接口的对象列表)
BL项目有一些业务逻辑,在将对象列表传递给DAL之前需要额外验证(也可能有错误处理)