【问题标题】:Configure routes and dependency injection outside of MVC UI在 MVC UI 之外配置路由和依赖注入
【发布时间】:2023-03-24 04:47:02
【问题描述】:

我们想将我们的composition root 移出我们的 UI 层并进入另一个项目。这意味着将Startup 类移出UI 层。当Startup类不在UI层的项目中时,如何配置路由?

我们目前有这个设置。

  • DAL 依赖于BLL,因为DAL 实现了BLL 接口。
  • UI 依赖于BLL,因为UI 控制器调用BLL 接口。
  • UI 依赖于 DAL,因为 UI 的 Startup 包含 composition root

当前依赖关系图

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

基于on this articleaspnet GitHub account 中的大量示例,我们在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 层中的控制器?

(Graphs courtesy of ASCIIFlow)

【问题讨论】:

    标签: c# asp.net asp.net-mvc dependency-injection asp.net-core


    【解决方案1】:

    魔法至高无上。它刚刚工作,非常好。我所要做的就是:

    1. 将 Startup.cs 从 UI.xproj 剪切并粘贴到新的 Application.xproj
    2. 在新的 Application.xproj 中添加对 UI 的依赖项。

    瞧,路由和依赖注入仍然可以在 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 项目.json

      "dependencies": {
        "Microsoft.AspNet.Mvc": "6.0.0-beta6-*",
        "BLL": "1.0.0-*"
      }
    

    BLL 项目.json

      "dependencies": {
      }
    

    DAL 项目.json

      "dependencies": {
        "EntityFramework": "7.0.0-beta6-*",
        "BLL": "1.0.0-*"
      }
    

    【讨论】:

    • 只是想知道,您的观点最终在哪里,您的启动项目是什么?哪个有 wwwroot ?
    • Application.xproj 现在有 Startup 和 wwwroot。目前,我们没有任何视图,因为我们正在做一个 REST api,但我们会将它们放在 UI.xproj 中。
    • 我不认为 mvc 会从 UI xproj 中选择视图,而无需对 razor 引擎进行一些修改以定位视图。 (可能是错的)让我知道它是怎么回事。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-16
    • 2020-09-14
    • 2020-01-07
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多