分层架构中的实体框架

时间:2011-01-06 04:26:01

标签: c# architecture entity-framework-4

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

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

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

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

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

现在我的三个问题:

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

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

  3. 我应该采取任何额外的步骤来执行chage跟踪,延迟加载等(通过等我的意思是实体框架在传统的1项目,非POCO代码生成中涵盖的功能)?
  4. 对这个冗长的问题表示感谢和道歉。

3 个答案:

答案 0 :(得分:12)

  

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

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

  

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

有点儿。 :)它有点主观,但通常你有:

  • 数据
    • 知识库来到这里。
  • 商业
    • 业务规则,域逻辑和实体。
  • 演示
    • UI /网络应用程序。

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

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

    我应该采取任何额外的步骤来执行跟踪CHAGE,延迟加载,等等(由等我的意思是实体框架覆盖在常规的1个项目,非POCO代码生成的特征)?

    如果您不使用POCO(例如您使用默认代码生成)。然后,您不必担心变更跟踪。

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

    相反,强制调用代码(例如业务/服务)急切加载所需的内容。

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

答案 1 :(得分:1)

1)图层对我来说似乎很好

2)不要在UI app.config中看到连接字符串的问题。必须在某个地方定义。您可以将DAL.config复制到您创建项目时可能在其中创建连接字符串的应用程序BIN文件夹,但对我来说这似乎不对。我个人会在您的UI层app.config

中管理它

答案 2 :(得分:1)

  

问题在于我必须定义   我的实体连接字符串   UI的web.config / app.config否则我   获得运行时异常。

连接字符串总是从正在执行的appDomain的app.config / web.config中获取(这里是你的asp.net app而不是DAL)。 所以,您可以做的是创建一个xml文件,用于在DAL项目中存储设置,并使用dot net framework提供的xml类来读取这些设置