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

时间:2018-11-20 10:50:49

标签: asp.net-core dependency-injection entity-framework-core

我在 ConfigureServices

中有我的EntityFrameworkCore DBContext
public void ConfigureServices(IServiceCollection services)
{               
    services.AddDbContext<MyDBContext>(Options => ...  );
    ...
}

我也有我的数据访问层工厂类,该类在构造函数中接收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);
    }    
}

为了使用数据访问层,我必须为每个请求创建 DataAccessFactory 的新实例。

我的问题是,它是否有意义,是否有任何方法可以创建 DataAccessFactory 的一个实例并将其添加为Singleton?

1 个答案:

答案 0 :(得分:1)

您可以在ConfigureServices的{​​{1}}内注册服务:

Startup.cs

并根据需要将其注入:

public void ConfigureServices(IServiceCollection services)
{
    ...
    services.AddSingleton<DataAccessFactory>();
}

在每个应用程序生命周期内仅创建一次。相反,如果您想更改每个请求的范围,只需将public class MyController { public readonly DataAccessFactory Factory; public MyController(DataAccessFactory factory) { Factory = factory; } } 更改为AddSingleton

更新

但是在混合不同范围的服务时要小心。您不能将寿命短的物体注入寿命长的物体,因为它会引起异常。在您的情况下,您需要将DbContext范围更改为单例(sic),或考虑将Factory生存期更改为Scoped。 Here是如何更改DbContext范围的示例。