如何在 Class 库中导入 WebApplicationBuilder?

How import WebApplicationBuilder in a Class Library?

我想为 WebApplicationBuilder 创建一个扩展方法:

public static void AddData(this WebApplicationBuilder builder)
{
    var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
    builder.Services.AddDbContext<ApplicationDbContext>(option =>
    {
        option.UseSqlite(connectionString);
    });
}

此方法适用于使用以下项目的项目:<Project Sdk="Microsoft.NET.Sdk.Web">, 但是如果我把这个方法放在 class 库中那么它就不起作用 (<Project Sdk="Microsoft.NET.Sdk>) 因为它找不到 Microsoft.AspNetCore.Builder

否则,如果我使用<Project Sdk="Microsoft.NET.Sdk.Web">,编译器会说项目中没有Main。

我该怎么办?

为什么我不能写这个?

using Microsoft.AspNetCore.Builder;

我最近在转换为 .Net 6 项目时这样做了。我也无法扩展 Builder,因此我将扩展添加到 IServiceCollection 并传入了配置。所以要使用你的例子,我的代码看起来更像:

public static void AddData(this IServiceCollection services, ApplicationSettings appSettings)
{
    services.AddDbContext<ApplicationDbContext>(option =>
    {
        option.UseSqlite(appSettings.ConnectionString);
    });
}

其中 ApplicationSettings 是绑定到 json 中的应用程序设置的自定义 class。所以我的 Program.cs 有这些行:

var builder = WebApplication.CreateBuilder(args);
ConfigurationManager configuration = builder.Configuration;

var appSettings = new ApplicationSettings();
configuration.Bind(appSettings);
builder.Services.AddData(appSettings);

在扩展方法中使用 IServiceCollection 只需要:

using Microsoft.Extensions.DependencyInjection;

我遇到了完全相同的问题,但 this Microsoft doc 解释了您需要做什么。

添加

  <ItemGroup>
    <FrameworkReference Include="Microsoft.AspNetCore.App" />
  </ItemGroup>

添加到您的 .csproj,然后您可以使用

using Microsoft.AspNetCore.Builder;

在以 Microsoft.NET.Sdk.

为目标的常规 class 库中