在 MVC UI 外部配置路由和依赖项注入



我们希望将组合根从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类移到第四个项目中,这样我们就可以消除UIDAL的依赖。

所需的依赖关系图

      +--------------------> UI.xproj 
      |                         +     
      |                         |     
      |                         |     
      |                         |     
      +                         v     
Application.xproj +--------> BLL.xproj
      +                         ^     
      |                         |     
      |                         |     
      |                         |     
      |                         +     
      +--------------------> DAL.xproj

我们当前的UI使用 ASP.NET MVC,路由就像变魔术一样工作,只需两个简单的步骤:

  1. UI.Startup内部,我们简单地称services.AddMvc()app.UseMvc()
  2. 在我们的控制器上,我们添加了 [Route("api/[controller]")] .

当我们在 Visual Studio 中运行项目时,我们可以浏览到/api/my-controller/并查看预期的操作结果。槽的。

在我们所需的设置中,UI将不再具有Startup类,因为该调用现在将在 Application .Application不仅负责配置依赖项,还需要配置路由。

我们如何配置路由以指向UI层内的控制器?

(图表由ASCIIFlow提供)

魔法至高无上。它刚刚奏效,真的很好。我所要做的就是:

  1. 将启动.cs从UI.xproj剪切并粘贴到新Application.xproj
  2. 将对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-*"
  }

最新更新