Asp.net core ASP.NET核心数据访问层自定义类AddSingleton

Asp.net core ASP.NET核心数据访问层自定义类AddSingleton,asp.net-core,dependency-injection,entity-framework-core,Asp.net Core,Dependency Injection,Entity Framework Core,我的EntityFrameworkCore DBContext位于配置服务中 public void ConfigureServices(IServiceCollection services) { services.AddDbContext<MyDBContext>(Options => ... ); ... } 为了使用数据访问层,我必须为每个请求创建新的DataAccessFactory实例 我的问题是,这有意义吗?有没有

我的EntityFrameworkCore DBContext位于配置服务中

public void ConfigureServices(IServiceCollection services)
{               
    services.AddDbContext<MyDBContext>(Options => ...  );
    ...
}
为了使用数据访问层,我必须为每个请求创建新的DataAccessFactory实例


我的问题是,这有意义吗?有没有办法创建一个DataAccessFactory的实例并将其添加为单例?

您可以在
Startup.cs中的
ConfigureServices
中注册您的服务:

public void配置服务(IServiceCollection服务)
{
...
services.AddSingleton();
}
并在需要的地方注入:

公共类MyController
{
公共只读数据访问工厂;
公共MyController(DataAccessFactory工厂)
{
工厂=工厂;
}    
}
每个应用程序生命周期只创建一次。如果您想更改它的作用域(例如每个请求),只需将
AddSingleton
更改为
AddScoped

更新:


但在混合不同作用域的服务时要小心。您不能将短生命对象注入长生命,因为它会导致异常。在您的情况下,您需要将DbCurror范围更改为Sigelon(SIC),或者考虑将工厂生存期更改为作用域。示例是如何更改DbContext范围。

您是否使用new operator创建了DataAccessFactory的实例?然后还可以手动创建数据库上下文。这样你就不用DI了。一般来说,在不同的请求之间重新创建数据库上下文是一种很好的做法,也是一种默认行为。在您已经注册了MyDBContext的代码中,您还可以注册DataAccessFactory。(作为单例或任何其他方式)是的,我为每个请求使用新操作符创建DataAccessFactory实例,通过DI捕获MyDBContext并为每个请求创建DataAccessFactory的新实例。现在我想,也许我可以创建DataAccessFactory one并单独创建它,而不是为每个请求创建DataAccessFactory的新实例。你给我看的文章链接回答了我的问题。我不知道AddDbContext将DbContext添加为作用域。现在我清楚了如何管理我的代码
public partial class DataAccessFactory
{
    public readonly ProductsDataAccess Products;
    public readonly CategoriesDataAccess Categories;

    public DataAccessFactory(MyDBContext db)
    {
        Products = new ProductsDataAccess(db);
        Categories = new CategoriesDataAccess(db);
    }    
}