我们希望将组合根从UI层移到另一个项目中。这意味着将Startup
类移出 UI 层。当 Startup
类不在 UI 层的项目中时,我们如何配置路由?
我们目前有此设置。
DAL
取决于BLL
,因为DAL
实现了BLL
接口。UI
取决于BLL
,因为UI
控制器调用BLL
接口。UI
取决于DAL
,因为UI的Startup
包含合成根。
当前依赖关系图
+---------+ UI.xproj
| +
| |
| |
| |
| v
| BLL.xproj
| ^
| |
| |
| |
| +
+---------> DAL.xproj
基于本文和 aspnet GitHub 帐户中的大量示例,我们将在 UI.Startup
类中连接我们的依赖项。文章指出:
在执行任何其他操作之前,请在应用程序启动方法中注册所有依赖项。
这就是我们在UI.Startup
课上所做的。不过,我们想做的是将我们的Startup
类移到第四个项目中,这样我们就可以消除UI
对DAL
的依赖。
所需的依赖关系图
+--------------------> UI.xproj
| +
| |
| |
| |
+ v
Application.xproj +--------> BLL.xproj
+ ^
| |
| |
| |
| +
+--------------------> DAL.xproj
我们当前的UI
使用 ASP.NET MVC,路由就像变魔术一样工作,只需两个简单的步骤:
- 在
UI.Startup
内部,我们简单地称services.AddMvc()
和app.UseMvc()
。 - 在我们的控制器上,我们添加了
[Route("api/[controller]")]
.
当我们在 Visual Studio 中运行项目时,我们可以浏览到/api/my-controller/
并查看预期的操作结果。槽的。
在我们所需的设置中,UI
将不再具有Startup
类,因为该调用现在将在 Application
.Application
不仅负责配置依赖项,还需要配置路由。
我们如何配置路由以指向UI
层内的控制器?
(图表由ASCIIFlow提供)
魔法至高无上。它刚刚奏效,真的很好。我所要做的就是:
- 将启动.cs从
UI.xproj
剪切并粘贴到新Application.xproj
- 将对
UI
的依赖项添加到新的 Application.xproj 中。
瞧,路由和依赖注入仍然在 Startup.cs 中工作。
应用程序启动.cs
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
this.ConfigurePersistenceServices(services);
}
public void Configure(IApplicationBuilder app, IServiceProvider serviceProvider)
{
app.UseMvc();
this.ConfigurePersistence(serviceProvider);
app.Run(async context => { await context.Response.WriteAsync("Hello!"); });
}
private void ConfigurePersistence(IServiceProvider serviceProvider)
{
var unitOfWork = serviceProvider.GetRequiredService<IUnitOfWork>();
unitOfWork.Create(new TodoItem("Test"));
unitOfWork.Save();
}
private void ConfigurePersistenceServices(IServiceCollection services)
{
services
.AddEntityFramework()
.AddInMemoryStore()
.AddDbContext<FarmContext>(options =>
{
options.UseInMemoryStore(persist: true);
});
// TODO: Use per request not singleton!
services.AddSingleton<IUnitOfWork, UnitOfWork>();
}
}
应用程序项目.json
"dependencies": {
"Microsoft.AspNet.Server.IIS": "1.0.0-beta6-*",
"Microsoft.AspNet.Server.WebListener": "1.0.0-beta6-*",
"Microsoft.AspNet.Mvc": "6.0.0-beta6-*",
"DAL": "1.0.0-*",
"BLL": "1.0.0-*",
"UI": "1.0.0-*",
"EntityFramework": "7.0.0-beta6-*",
"EntityFramework.SqlServer": "7.0.0-beta6-*",
"EntityFramework.InMemory": "7.0.0-beta6-*"
}
UI project.json
"dependencies": {
"Microsoft.AspNet.Mvc": "6.0.0-beta6-*",
"BLL": "1.0.0-*"
}
BLL project.json
"dependencies": {
}
DAL project.json
"dependencies": {
"EntityFramework": "7.0.0-beta6-*",
"BLL": "1.0.0-*"
}