【发布时间】:2018-02-03 20:33:31
【问题描述】:
在 Mvc Core 中使用 Clean Architecture 时,Layer with Name 可以是这样的:
- 基础设施
- 核心
- 网络
这个链接有完整的描述:
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