如何在不使用 Entity Framework 的情况下在 Startup.cs 中添加 DbContext?

How to add DbContext In Startup.cs without using Entity Framework?

我目前正在开发一个 class 库,稍后将作为块包上传,这样如果用户创建 a.NET 核心应用程序,she/he可以下载nugget包并相应使用。

基本上在class 库中,Entity Framework、Nethereum 和其他软件包作为依赖项安装。我的目标之一是不要求用户将 Entity Framework 添加到他们的应用程序中(因为 nugget 包(,即我正在构建的 class 库 ))有没有安装。因此,class 库中有一个 DbContext 接受数据库连接字符串并构建选项。

public class BEFDbContext: DbContext
{
    
    public BEFDbContext(string connectionString) : 
        base(SqlServerDbContextOptionsExtensions.UseSqlServer(new DbContextOptionsBuilder(), connectionString).Options) { }

    public DbSet<ApplicationEvent> Events { get; set; }

}

接下来,用户必须在扩展 class 库中找到的 BEFDbContext class 的应用程序代码中创建另一个 class。

public class NewDatabaseContext: BEFDbContext
{        
    public NewDatabaseContext(string connectionString):base(connectionString){}
}

到目前为止一切顺利,但是,在这一点上,我想 'initialise' NewDatabaseContext class 中的 Startup.cs class。通常,人们会使用 Entity Framework 并添加这样的代码:

services.AddDbContextPool<NewDatabaseContext>(options =>
        {
            options.UseSqlServer(Configuration.GetConnectionString("defaultconnection"));
        });

但是,正如我之前提到的,目标之一是不要求 users/developers 将 Entity Framework 添加到应用程序( 再一次,因为我们在 class图书馆).

所以,我的问题是 如何在不使用 Entity Framework 的情况下将 NewDatabaseContext class 添加为 Startup.cs 中的 DbCcontext?

由于您想要替代响应,您可以使用扩展方法

在您的库中添加以下代码

public static class ServiceCollectionExtensions
{
    public IServiceCollection AddApplicationDbContext<T>(this IServiceCollection services, IConfiguration configuration) where T : BEFDbContext
    {
        services.AddDbContextPool<T>(options =>
        {
            options.UseSqlServer(Configuration.GetConnectionString("defaultconnection"));
        });
        return services;
    }
}

然后在应用程序启动时就可以使用

public void ConfigureServices(IServiceCollection services)
{
    ...
    services.AddApplicationDbContext<NewDatabaseContext>(Configuration);
    ...
}

您可以根据需要对此进行更改。比如接受连接字符串而不是整个配置等等

这个答案使用泛型和扩展方法。如果您想了解更多详情,请查看:

通用方法:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/generic-methods

扩展方法:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/extension-methods