猿教程 Logo

.Net连接MongoDb:从MongoDb .NET驱动程序开始

介绍

在上一篇文章中,我们研究了如何从MongoDb shell中的集合中删除文档。 我们看到这不是一个过于复杂的操作。 我们只需要在一个集合上调用remove方法,并提供一个查询文档,就像我们提供给find函数一样。

在这篇文章中,我们将开始研究如何通过MongoDb .NET驱动程序从.NET项目与MongoDb通信。

.NET驱动程序

在我们继续之前,请确保启动命令提示符并使用mongod命令启动MongoDb服务器。 接下来创建一个新的.NET控制台项目并给它一些名称,这并不重要。 我叫我的MongoDbDotNet。 将一个名为Repository的文件夹和另一个称为基础设施的文件夹添加到项目中。 通常它们应该在一个单独的C#库中,但我们将在此演示中进行简化的结构。

MongoDb .NET驱动程序可通过NuGet获得。 将以下包添加到项目中:


在撰写本文时,最新的稳定版本为2.2.3。 当你阅读这篇文章时,可能会有一个更新的驱动程序。

就像一个SQL Server驱动程序,如EntityFramework,MongoDb驱动程序也需要一个连接字符串。 有一个关于如何在这里构建MongoDb连接字符串的例子的完整列表。 打开app.config并将以下连接字符串添加到connectionStrings部分:

<connectionStrings>
    <add connectionString="mongodb://localhost:27017" name="MongoDb"/>
</connectionStrings>

上面提供的示例可能很简单:我们连接到默认端口27017上的本地MongoDb服务器。更为现实的连接字符串可能会比其他属性更长,例如身份验证,数据库集群中的服务器名称,读取 并写政策等。为了我们的目的,这只是一个起点。

我们还将在app.config的应用程序设置部分中添加数据库和集合名称:

<appSettings>
    <add key="RestaurantsCollectionName" value="restaurants"/>
    <add key="ZipCodesCollectionName" value="zipcodes"/>
    <add key="PeopleCollectionName" value="people"/>
    <add key="DemoDatabaseName" value="model" />
</appSettings>

接下来,我们将开始构建上下文对象以轻松访问数据库和集合。 我们的第一个目标是连接到数据库。

MongoDb对象上下文

作为.NET开发人员,您可能熟悉EntityFramework中对象上下文的概念。 它是一个复杂的对象,提供直接访问数据库中对象的句柄,更新它们,删除它们,添加新的对象等。它还具有更多的功能,例如状态跟踪。 EntityFramework为开发人员提供了广泛的自动化工具。 只想想一些功能,如代码优先,数据库优先和模型优先。 我们还有自动迁移和DB表的初始播种。

这里是在.NET项目中使用MS SQL与EF之间使用MongoDb的第一个主要区别:MongoDb中几乎没有任何“魔法”工具。 没有内置的上下文可以称为“SaveChanges”,没有迁移工具,没有Seed方法来填充数据库表,即集合等。 无论如何,迁移工具在MongoDb中没有任何意义,因为MongoDb集合中没有严格的模式。 在一个集合中插入一个Car对象,然后是一个House对象就可以了。 将它们放在同一文档中是完全合法的。 现在,在实践中你可能不会这样做。 但是,您可以自由地向对象添加和删除属性,而不用担心数据迁移。

基础设施依赖

接下来,我们将为这些抽象创建一些抽象和实现。 抽象形式是从配置源读取的两个接口的形式。 项目设置,如连接字符串和应用程序设置可以来自各种来源,而不仅仅是配置文件:数据库,外部文件,Web服务等。

将以下界面插入到Infrastructure文件夹中:

namespace MongoDbDotNet.Infrastructure
{
	public interface IConfigurationRepository
	{
		T GetConfigurationValue<T>(string key);
		T GetConfigurationValue<T>(string key, T defaultValue);
	}
}
namespace MongoDbDotNet.Infrastructure
{
	public interface IConnectionStringRepository
	{
		string ReadConnectionString(string connectionStringName);
	}
}

...这里有两个实现。 您也可以将它们放在Infrastructure文件夹中:

using System.Configuration;
namespace MongoDbDotNet.Infrastructure
{
	public class AppConfigConnectionStringRepository : IConnectionStringRepository
	{
		public string ReadConnectionString(string connectionStringName)
		{
			return ConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString;
		}
	}
}
using System;
using System.Collections.Generic;
using System.Configuration;

namespace MongoDbDotNet.Infrastructure
{
	public class ConfigFileConfigurationRepository : IConfigurationRepository
	{
		public T GetConfigurationValue<T>(string key)
		{
			string value = ConfigurationManager.AppSettings[key];
			if (value == null)
			{
				throw new KeyNotFoundException("Key " + key + " not found.");
			}
			try
			{
				if (typeof(Enum).IsAssignableFrom(typeof(T)))
					return (T)Enum.Parse(typeof(T), value);
				return (T)Convert.ChangeType(value, typeof(T));
			}
			catch (Exception ex)
			{
				throw ex;
			}
		}

		public T GetConfigurationValue<T>(string key, T defaultValue)
		{
			string value = ConfigurationManager.AppSettings[key];
			if (value == null)
			{
				return defaultValue;
			}
			try
			{
				if (typeof(Enum).IsAssignableFrom(typeof(T)))
					return (T)Enum.Parse(typeof(T), value);
				return (T)Convert.ChangeType(value, typeof(T));
			}
			catch (Exception ex)
			{
				return defaultValue;
			}
		}
	}
}

您需要添加对以下库的引用才能编译上述代码:


MongoDb存储库存根

我们现在将开始构建MongoDb上下文。 将一个名为ModelContext的新类插入Repository文件夹。 我们将把它保持在最低限度:

using MongoDB.Driver;
using MongoDbDotNet.Infrastructure;
using System;

namespace MongoDbDotNet.Repository
{
	public class ModelContext
	{
		private IMongoClient Client { get; set; }
		private IMongoDatabase Database { get; set; }
		private static ModelContext _modelContext;

		private ModelContext() { }

		public static ModelContext Create(IConfigurationRepository configurationRepository, 
			IConnectionStringRepository connectionStringRepository)
		{
			if (_modelContext == null)
			{
				_modelContext = new ModelContext();
				string connectionString = connectionStringRepository.ReadConnectionString("MongoDb");
				_modelContext.Client = new MongoClient(connectionString);
				_modelContext.Database = _modelContext.Client.GetDatabase(configurationRepository.GetConfigurationValue("DemoDatabaseName", "model"));
			}
			return _modelContext;
		}

		public void TestConnection()
		{
			var dbsCursor = _modelContext.Client.ListDatabases();
			var dbsList = dbsCursor.ToList();
			foreach (var db in dbsList)
			{
				Console.WriteLine(db);
			}
		}
	}
}

上述代码使用工厂模式创建一个ModelContext对象。 Create方法只能构建一个ModelContext,然后在每个新的请求上返回它。 换句话说,我们将重复使用相同的上下文。 没关系,MongoDb就是这样使用的。 绝对不需要创建一个处理与MongoDb服务器的连接的对象的全新实例。 底层机制将自动打开并关闭您的连接。 我们不会让这些有趣的“连接关闭”和“行没有找到或改变”的异常,如LINQ to Entities。 MongoClient对象是从.NET与MongoDb数据库通信的中心句柄。 我们还有一些代码来测试与MongoDb的连接。 我们只需掌握数据库名称并将其写入控制台。

第一个测试

我们可以轻松地从Program.cs调用TestConnection方法,如下所示:

using MongoDbDotNet.Infrastructure;
using MongoDbDotNet.Repository;

namespace MongoDbDotNet
{
	class Program
	{
		static void Main(string[] args)
		{
			ModelContext modelContext = ModelContext.Create(new ConfigFileConfigurationRepository(), new AppConfigConnectionStringRepository());
			modelContext.TestConnection();
		}
	}
}

如果一切顺利,那么您将看到mongod上可用的数据库列表。 我以前的演示有几个数据库:

{ "name" : "loadtest", "sizeOnDisk" : 147456.0, "empty" : false }
{ "name" : "local", "sizeOnDisk" : 73728.0, "empty" : false }
{ "name" : "model", "sizeOnDisk" : 6684672.0, "empty" : false }

因此,不要担心,如果你没有看到例如 输出中的“load test”。 至少如果你已经遵循了这个系列,“模型”应该在那里。

好的,我们有数据库处理代码的存根。 我们将在下一篇文章中加以说明。


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/CsharpMongo/13.html