c# - 两个 ASP.NET Core 项目之间的依赖注入(inject)

标签 c# asp.net asp.net-core .net-core entity-framework-core

我目前正在使用 ASP.NET Core 开发一个 Web 应用程序,并使用 Entity Framework Core 处理数据库。我的 VS 解决方案中有两个项目; WebApp(主应用程序)和 DatabaseHandler(EF Core 处理程序)。我已经使用 Pomelo 包安装了 Entity Framework Core,因为我使用的是 MySQL 数据库。
我一直在关注 Microsoft 文档来设置 EF Core、连接字符串和所有这些,它工作正常。我能够对数据库进行迁移、更新和处理。但是,我不确定我是否正确执行此操作,因为最新的 EF Core 教程使用依赖注入(inject)并且我不熟悉它。
现在我将 DbContext 对象作为参数从 WebApp 传递给 DatabaseHandler,因为我希望所有与数据库相关的东西只存在于 DatabaseHandler 中。这可行,但是是否可以从另一个项目调用函数并共享 DbContext 对象而不将其作为参数传递?我可能没有很好地解释它,我希望我的代码能更好地解释它。
WebApp/Startup.cs:
这是我从 appsettings.json 加载连接字符串的地方。

public Startup(IConfiguration configuration)
{
    Configuration = configuration;
}

public IConfiguration Configuration { get; }

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContextPool<DataContext>(
        options => options.UseMySql(Configuration.GetConnectionString("DefaultConnection")
    ));

    services.AddRouting(options => options.LowercaseUrls = true);
    services.AddControllersWithViews();
}
WebApp/HomeController.cs:
这是我从 DatabaseHandler 项目中调用 GetAllChallenges() 函数的地方,我还将 DataContext 对象作为参数传递。这是我要避免的!
public class HomeController : Controller
{
    private readonly ILogger<HomeController> _logger;
    private readonly DataContext db;

    public HomeController(ILogger<HomeController> logger, DataContext _db)
    {
        _logger = logger;
        db = _db;
    }

    public IActionResult Challenges()
    {
        List<Challenge> ChallengesList = DatabaseHandler.HandleChallenges.GetAllChallenges(db);
        return View(ChallengesList);
    }
}
数据库处理程序/DataContext.cs:
这是我初始化实体类等的地方。
public class DataContext : DbContext
{
    public DataContext(DbContextOptions<DataContext> options) : base(options) { }
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { }

    // Tables
    public DbSet<User> Users { get; set; }
    public DbSet<Challenge> Challenges { get; set; }

    // Data seeding
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Seed();
    }
}
DatabaseHandler/HandleChallenges.cs:
这是我拥有所有数据库功能的地方。结果将返回到 WebApp 项目中的 Controller 。
public class HandleChallenges
{
    public static List<Challenge> GetAllChallenges(DataContext db)
    {
        var Data = db.Challenges;
        List<Challenge> ChallengesList = Data.ToList();
        return ChallengesList;
    }
}
我已经研究过依赖注入(inject),但我不确定如何在两个项目之间使用它。有没有更简单的方法来实现这一点,也许根本不使用 DI?只要我不需要每次需要从 DatabaseHandler 调用函数时都将 DataContext 对象作为参数传递,我就很满意。
有人可以帮我理解吗?提前非常感谢!

最佳答案

您可以使用我已经多次使用过的选项模式。尽管您使用了数据库,但它工作得很好。由于依赖注入(inject),您可以从多个项目中访问。阅读有关选项模式 (https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/options?view=aspnetcore-3.1) 的文档很有用,但我也会为您提供我自己的示例:

  • 首先,您创建模型来存储连接字符串、dbName 等。请记住将其添加到主项目之外的库中(例如 Web Api):
     public class NameOfYourProject_ApiDbSettings : IIMTTApiDbSettings
     {
         public NameOfYourProject_ApiDbSettings()
         {
         }
         public string CollectionName { get; set; }
         public string ConnectionString { get; set; }
         public string DatabaseName { get; set; }
     }
    
    
    public interface I_NameOfYourProject_ApiDbSettings
    {
     string CollectionName { get; set; }
     string ConnectionString { get; set; }
     string DatabaseName { get; set; }
    }
    
  • 其次,您使其可用于所有项目:
        services.Configure<NameOfYourProjectApiDbSettings>(options =>
         {
             options.ConnectionString
                 = Configuration.GetSection("NameOfYourProjectDbSettings:ConnectionString").Value;
             options.DatabaseName
                 = Configuration.GetSection("NameOfYourProjectDbSettings:DatabaseName").Value;
         });
    
  • 然后你可以在多个项目中使用它。 (请记住为您的模型添加引用-> 第 1 点。我始终将模型保存在存储库中)我将给您举个使用 MongoDb 的示例:
     private readonly IMongoDatabase _database = null;
    
     public SomeObjectContext(IOptions<IMyProjectDbSettings> settings)
     {
         var client = new MongoClient(settings.Value.ConnectionString);
         if (client != null)
             _database = client.GetDatabase(settings.Value.DatabaseName);
     }
    
     public IMongoCollection<MyModel> MyModels
     {
         get
         {
             return _database.GetCollection<MyModel>("MyModels");
         }
     }
    
  • 关于c# - 两个 ASP.NET Core 项目之间的依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62994950/

    相关文章:

    javascript - 登录页面和注册页面我需要将所有内容放在一页中

    asp.net - 如何调用 Web 服务并使用 URL 传递参数

    asp.net-core - 如何在ASP.NET 5中使用 “old”依赖项

    c# - 将 CSV 文件从 Angular7 传递到 MVC .Net Core

    c# - 使用 NCalc 将用户输入评估为字符串中的参数

    c# - 如何使用正则表达式从字符串中获取 ID

    asp.net - 如何在 ASP.NET Web 应用程序上使用表单例份验证最好地处理基于角色的权限?

    c# - ASP.NET Core 和 CreateErrorResponse

    c# - 为使用 IdentityServer4 进行身份验证的 Asp Net Core API 构建集成测试

    c# - 即使使用预编译 View ,EF6 模型创建也非常慢