在ASP.Net MVC中管理MongoDB连接的正确方法是什么?

时间:2012-04-20 06:58:20

标签: c# asp.net asp.net-mvc mongodb mongodb-.net-driver

管理MongoServer类生命周期的最佳实践是什么?我应该创建一个并在每个请求结束时将其关闭,还是应该使用像StructureMap这样的应用程序将其保存为应用程序整个生命周期的单例?

任何帮助都表示赞赏。

3 个答案:

答案 0 :(得分:24)

the official documentation中声明MongoServerMongoDatabaseMongoCollection是线程安全的,并且您应该创建一个MongoServer对于您连接的每个数据库。

因此,MongoServerMongoDatabaseMongoCollection可以安全地配置为单例。 MongoServer甚至可以通过为后续调用返回相同的MongoDatabase实例来帮助执行此操作,而MongoDatabase将对MongoCollection执行相同的操作。

即。您的MongoServer实例可以安全地配置为在IoC容器中具有单一生活方式,您也可以为MongoDatabase甚至MongoCollection设置注入。

我自己在温莎使用这个策略 - 你可以在这里看到MongoInstallerhttps://gist.github.com/2427676 - 它允许我的课程继续这样做:

public class SomeClass
{
    public SomeClass(MongoCollection<Person> people)
    { ... }
}

为了注入一个集合,很好并且可以随时使用。

答案 1 :(得分:7)

C#驱动程序自动管理与服务器的连接(它使用连接池)。当驱动程序自动连接时,无需调用server.Connect。不要调用server.Disconnect,因为它会关闭连接池中的所有连接并干扰高效的连接池。

就管理MongoServer实例的生命周期而言,您可以将其存储在静态变量中,并将其用于进程的生命周期(并跨线程共享它,它是线程安全的)。或者,您可以在需要获取服务器实例时再次调用MongoServer.Create。只要您继续使用相同的连接字符串调用MongoServer.Create,您将继续返回相同的MongoServer实例。

答案 2 :(得分:2)

使用任何IOC容器(结构图,温莎等)注入它,并根据请求保持其生命周期。