我在 ConfigureServices
中有我的EntityFrameworkCore DBContextpublic 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?
答案 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范围的示例。