【问题标题】:Move di container into his own project in .NET Core在 .NET Core 中将 di 容器移动到他自己的项目中
【发布时间】:2022-02-13 04:35:32
【问题描述】:

我正在 .NET Core 3.1 中构建 API。我尝试在典型的 3 层中解耦这个项目。我没有 UI 层,而是拥有带有控制器的 API 项目。我还有一个用于逻辑的类库项目,以及另一个作为数据访问层的类库项目。

我正在尝试对所有项目使用依赖注入。我的问题是,到目前为止,我在我的 API 项目中的startup.cs 中的ConfigureServices 方法中将我的接口和类注册为服务。

但这意味着逻辑和数据访问层将引用 API 项目。为了解决这个问题,我想,如果我将 DI 容器移动到他自己的“映射”类库项目中并在所有其他项目中引用它,那将是最好的。这是一个好习惯吗?

如果是,这样的项目会是什么样子,如何设置容器以及如何在 API 的项目 ConfigureServices 方法中实例化 startup.cs

【问题讨论】:

  • 将容器留在 startup.cs(API 层)中,但在数据层中调用一个函数(使用 IServiceCollection),然后注册它自己的服务。
  • @Neil 感谢您的回答,但我也必须对逻辑层做同样的事情。我不确定。
  • 我一般做的就是Presentation layer (API)会调用逻辑层,而逻辑层会调用数据层。
  • @Neil 并像“参考”链一样构建。我明白了。

标签: c# .net-core dependency-injection ioc-container


【解决方案1】:

但这意味着逻辑和数据访问层将 引用 API 项目

我认为它不应该,恰恰相反,API 项目将成为解决方案入口点,是“了解”所有其他依赖项并将它们粘合在一起的唯一项目。

其他项目需要引用IServiceCollection Interface,可以通过安装Microsoft.Extensions.DependencyInjection NuGet包来完成。

每个项目都可以引入自己的“注册”方法,可以通过入口点调用。

// In Logic project
public IServiceCollection AddLogic()
{
    services.AddSingleton<MyLogic>();
    // Add other logic types

    return services;
}

// In Data project
public IServiceCollection AddDataAccess(string connectionString)
{
    services.AddTransient<IRepository, SqlRepository>();
    services.AddDbContext<MyDbContext>(o => o.UseSqlServer(connectionString));

    return services
}

// Startup
var connectionString = Configuration.GetConnectionString("MyDatabase");
services.AddLogic();
services.AddDataAccess(connectionString);

其他项目需要引用 API 项目的唯一方法是当您使用 API 项目中的某些类型时。如果是这种情况,则将它们移至将要使用它们的项目或引入另一个 API 和其他项目都可以引用的项目。

【讨论】:

  • 感谢您的回复。我试过了,我想我明白了。但是,如果我需要从逻辑项目中的数据项目中调用一个,比如说,handlerclass 怎么办?那我得引用Data项目,把handlerclass注入到逻辑类的构造函数中吧?对不起,我现在很困惑,最近几天我读了很多东西。
  • 而且我想我有一个误解,因为你是对的,其他项目不需要引用api项目,api项目需要引用其他的,或者只是一个,如果我把我在那个项目中的注册。
猜你喜欢
  • 2017-03-17
  • 2017-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-07
  • 2020-06-09
相关资源
最近更新 更多