分层架构中的实体框架

Kam*_*yar 9 c# architecture entity-framework-4

我正在使用实体框架的分层架构.这是我到目前为止所提出的(所有项目除了UI都是类库):

  • 实体:POCO实体.完全坚持无知.没有参考其他项目.由Microsoft的ADO.Net POCO实体生成器生成.

  • DAL:带有上下文类的EDMX(实体模型)文件.(t4生成).参考文献:Entities

  • BLL:业务逻辑层.将在此层上实现存储库模式.参考文献:Entities,DAL.这是填充objectcontext的地方:var ctx=new DAL.MyDBEntities();

  • UI:表示层:ASP.NET网站.引用:Entities,BLL+配置文件中实体的连接字符串条目(问题#2).

现在我的三个问题:

  1. 我的图层判断方法是否正确?
  2. 在我的UI中,我按如下方式访问BLL:
    var customerRep = new BLL.CustomerRepository();
    var Customer = customerRep.GetByID(myCustomerID);

    问题是我必须在我的UI的web.config/app.config中定义实体连接字符串,否则我会得到一个运行时异常.IS定义UI中的实体连接字符串会破坏图层的区别吗?或者它是否可以在多层分层架构中进行访问.

  3. 我应该采取任何额外的步骤来执行chage跟踪,延迟加载等(通过等我的意思是实体框架在传统的1项目,非POCO代码生成中涵盖的功能)?

感谢并为这个冗长的问题道歉.

RPM*_*984 12

BLL:业务逻辑层.将在此层上实现存储库模式

我真的不同意这一点.存储库旨在抽象底层数据存储(SQL Server,XML等).这是一个数据层问题,而不是业务问题 - 因此它为什么要在BLL中呢?

我的图层判断方法是否正确?

的种类.:)这有点主观,但通常你有:

  • 数据
    • 存储库在这里.
  • 商业
    • 业务规则,域逻辑和实体.
  • 介绍
    • UI/Web应用程序.

现在,通常这三个被进一步分解.所以在你的情况下我会:

  1. MyCompany.MyProject.Data(存储库)
  2. MyCompany.MyProject.Business.Services(调用存储库,应用业务规则等)
  3. MyCompany.MyProject.Business.DomainModel(实体)
  4. MyCompany.MyProject.UI(网络应用程序)

我应该采取任何额外的步骤来执行chage跟踪,延迟加载等(通过等我的意思是实体框架在传统的1项目,非POCO代码生成中涵盖的功能)?

如果您没有使用POCO(例如您使用默认代码生成).然后,您无需担心更改跟踪.

至于延迟加载 - 这是你需要做出的决定.我个人禁用延迟加载,因为我不希望懒惰的开发人员在他们没有要求时返回一堆记录.

相反,强制调用代码(例如业务/服务)急切地加载它需要的东西.

如果你使用ASP.NET MVC应用程序,如果你有延迟加载,你的View最终可能会在渲染时调用数据库,打破MVC模式.

  • 不.存储库/ DAL中应该没有业务.如果要将业务逻辑应用于查询,您可以选择几个选项.1)使您的存储库方法特定于业务:例如`List <Order> GetOrdersForACustomer(int customerId)`.或2)IQueryable存储库.更难/有风险.例如`IQueryable <Order> FindOrders()`.然后BLL调用此方法并执行业务逻辑(延迟执行).现在,我坚持使用选项1. (3认同)