我目前正在使用 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) 的文档很有用,但我也会为您提供我自己的示例:
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;
});
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/