【发布时间】:2015-12-12 06:03:08
【问题描述】:
由于我想使用新的内置依赖注入,我正在努力寻找一种优雅的方式将我的 DAL 层与 ASP.NET 5 中的 MVC/UI 层分开。
例如,我有一个 ASP.NET 5 项目、一个业务层项目和一个数据访问项目,其中我有各种实体框架代码,例如实体和上下文。在 ASP.NET 5 中设置上下文并以数据库为目标,主要文档建议我在 StartUp.cs 类中执行类似的操作
services.AddEntityFramework()
.AddSqlServer()
.AddDbContext<BookContext>(options =>
{
options.UseSqlServer(Configuration.Get("Data:ConnectionString"));
});
这意味着我现在必须在基本上是我的 UI 层的地方引用我的 DAL,根据周围的各种专家和博客文章,多年来这一直是不好的做法。
我解决此问题的一种方法是创建两个新项目,一个是 CompositeRoot 项目,其中包含工厂类以生成我的业务类,然后访问 DAL 以及一个带有配置类的实用程序项目,其中有一个 @ 987654324@ 属性,我可以将其传递到我的上下文中,然后我使用内置的 DI 将所有内容连接起来并避免在我的 UI 层中引用我的 DAL。但是我遇到了最新版本的实体框架(beta 7)的问题,因为现在似乎无法在上下文的构造函数或可覆盖的OnConfiguration 方法中指定连接字符串。另外,到目前为止,所有文档似乎根本不关心这种混合问题。这就是我们现在做事的方式吗?相信开发人员不会做“坏”的事情,比如直接在 UI 中引用 DAL 类?还是人们正在采用一种模式来通过这种新的内置 DI/ASP.NET 5 配置来保持稳定?
【问题讨论】:
-
“这意味着我现在必须在基本上是我的 UI 层的地方引用我的 DAL”。这是不正确的。这段代码不在你的 UI 层;这是您的组合根层。您将层(逻辑工件)误认为程序集(部署工件),并且您隐式选择在一个程序集中包含两个层。如需更深入的解释,请阅读此答案:stackoverflow.com/a/9505530/264697。
-
JK,是的,我认为这是可以接受的,而且不是太宽泛,因为我指的是特定框架的特定问题。谢谢史蒂文,我会调查你的帖子。我认为我的主要问题是 Microsoft 已强制他们的项目模板包含所有 MVC 项(控制器/视图)以及 StartUp 类中的组合,这意味着如果您的 EF 代码,您必须对 DAL 进行项目级别的引用包含在那里,您没有单独的组合根。
-
为什么说不能分开呢?为什么你不能创建一个名为 Database 的单独项目。然后 BookContext 只是对该项目的引用。最后,options 参数覆盖了你设置的连接字符串。
-
以防万一您不知道如何设置您的控制台应用程序:docs.asp.net/en/latest/dnx/console.html#creating-a-console-app
标签: asp.net dependency-injection asp.net-core asp.net-core-mvc entity-framework-core