我见过很多代码使用Repository模式进行数据库连接,使用addTransient
注入依赖项,以便为每个请求获取一个唯一的Repository。
service.AddTransient<IRepository, Repository>();
问题是如果在Repository的构造函数中调用数据库的Context,那么将在每个请求上(重新)创建数据库连接,不是吗?
// Repository.cs
---------------------------------------------------------------
public Repository(IOptions<Settings> settings)
{
_context = new Context(settings);
}
// Context.cs
---------------------------------------------------------------
public Context(IOptions<Settings> settings)
{
_client = new MongoClient(settings.Value.ConnectionString);
_database = _client.GetDatabase(...);
}
数据库的Context应该是Singleton吗?
service.AddSingleton(new Context(...));
或者MongoDB上下文是否应该与AddDbContext<Context>
一起传递?
答案 0 :(得分:0)
如果调用对象的构造函数:是,则创建一个新实例。
是否使用SingleTon基本上只是您自己使用这些对象的问题。
如果您的存储库仅依赖于输入而不是存储库中的存储数据,那么将其作为SingleTon就非常有意义。但是,您应该考虑如何在上下文中访问数据;如果每个呼叫都应该打开一个新连接或尽可能使用相同的连接。
但最重要的是在我看来:如果您从任何一种解决方案中看到应该尝试瞄准的应用程序对您的应用程序有任何好处,您将自己知道答案。如果您没有从模式中受益,那么将实现更改为SingleTon没有多大意义。