我正在使用实体框架的分层架构。这是我到目前为止所提出的(所有项目除了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)。
现在我的三个问题:
在我的界面中,我按如下方式访问BLL:
var customerRep = new BLL.CustomerRepository();
var Customer = customerRep.GetByID(myCustomerID);
问题是我必须在我的UI的web.config / app.config中定义实体连接字符串,否则我会得到一个运行时异常。 IS定义UI中的实体连接字符串会破坏图层的区别吗?或者它是否可以在多层分层架构中进行访问。
对这个冗长的问题表示感谢和道歉。
答案 0 :(得分:12)
BLL:业务逻辑层。将在此层上实现存储库模式
我不同意这一点。存储库旨在抽象底层数据存储(SQL Server,XML等)。它是一个数据层问题,而不是业务问题 - 因此它为什么要在BLL中?
我的图层判断方法是否正确?
有点儿。 :)它有点主观,但通常你有:
现在,通常这三个人会被进一步分解。所以在你的情况下,我会:
我应该采取任何额外的步骤来执行跟踪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类来读取这些设置