【问题标题】:Configuration services without reference Infrastructure in mvc coremvc核心中没有参考基础设施的配置服务
【发布时间】:2018-02-03 20:33:31
【问题描述】:

在 Mvc Core 中使用 Clean Architecture 时,Layer with Name 可以是这样的:

  1. 基础设施
  2. 核心
  3. 网络

这个链接有完整的描述:

https://docs.microsoft.com/en-us/dotnet/standard/modern-web-apps-azure-architecture/common-web-application-architectures

Principles 说 Web 项目不应该有任何来自 Infrastructure 类库的引用。那么如何使用 DI 容器来解决这个问题呢?

Startup.cs 中的这段代码使用 Infrastructure 来配置一些东西:

public void ConfigureProductionServices(IServiceCollection services)
{
    services.AddDbContext<CatalogContext>(c =>
    {
        try
        {
            c.UseSqlServer(Configuration.GetConnectionString("CatalogConnection"));
        }
        catch (Exception ex)
        {
            var message = ex.Message;
        }
    });

    services.AddDbContext<AppIdentityDbContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("CatalogConnection")));

    ConfigureServices(services);
}

public void ConfigureServices(IServiceCollection services)
{
    services.AddIdentity<ApplicationUser, IdentityRole>()
        .AddEntityFrameworkStores<AppIdentityDbContext>()
        .AddDefaultTokenProviders();

    services.AddScoped(typeof(IRepository<>), typeof(EfRepository<>));
    .
    .
    _services = services;
}

【问题讨论】:

  • “原则说基础设施不应该有任何对基础设施类库的引用。” ——你能引用文章中的哪个地方吗?从您的代码示例中,不清楚您到底面临什么问题?
  • @Jasen 它的错误,我编辑了
  • 因此,如果您担心在不参考基础设施项目的情况下无法连接 DI 容器(在 Web 项目中)——别担心。组合根中的 DI 注册将需要这些引用——只是不要让 Web 项目的其余部分直接与基础结构交互——这可以通过不在 Web 代码中使用基础结构命名空间来缓解。看到这个相关的问题有很多解释stackoverflow.com/questions/5267525/…
  • @Jasen 我希望如此,但是在那个链接上,有一条注释说:为了在 UI 项目的 Startup.cs 文件中的 ConfigureServices 中连接依赖注入,项目可能需要参考基础设施项目。可以通过使用自定义 DI 容器最轻松地消除这种依赖关系。就本示例而言,最简单的方法是允许 UI 项目引用 Infrastructure 项目。 !!!
  • DI Composition Root 需要引用。在这种情况下,Composition Root 存在于 Web 项目中——继续添加引用(用于 DI 注册)。没有实际的 Web UI 代码直接引用基础架构。

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


【解决方案1】:

你说:

Principles 说 Web 项目不应该有任何来自 Infrastructure 类库的引用。那么如何使用 DI 容器来解决这个问题呢?

但是article you linked 说:

请注意,实线箭头表示编译时依赖项,而虚线箭头表示仅运行时依赖项。使用干净的架构,UI 层在编译时与应用程序核心中定义的接口一起工作,理想情况下不应该对基础设施层中定义的实现类型有任何了解。然而,在运行时,应用程序需要执行这些实现类型,因此它们需要存在并通过依赖注入连接到应用程序核心接口。

本文描述的是应用程序的逻辑架构,而不是应用程序的物理架构。从逻辑上讲,用户界面对基础设施层一无所知,但在物理上,用户界面层中应用程序启动时的 DI 代码(就在运行时应用程序的最开始处)将应用程序组件组合在一起。这个概念可以是illustrated and explained best here

我们的想法是我们可以独立地使用彼此的程序集,而无需拖累额外的依赖项。在实践中,使单元和集成测试更容易、更可靠。

【讨论】:

  • 没错,但请参阅为 mvc 5 编写解决方案的 @Steve Smith 帖子。他使用 StructureMap,我正在这样做,但启动配置阻止了我:ardalis.com/…
  • 将 StructureMap 注册表放在使用它的组件中 不是一种非常实用的方法。如果您想用 LibraryX 中的一个替换基础设施组件之一,Infastructure 需要一个对 LibraryX 的项目引用来实现这一点。看到问题了吗?我们不希望我们的程序集像这样相互了解,这样它们就可以在其他上下文中使用,而不会拖累不必要的依赖关系。
猜你喜欢
  • 2010-11-25
  • 1970-01-01
  • 2018-04-27
  • 2014-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-22
  • 2021-01-08
相关资源
最近更新 更多