上一小节我们演示了一个简单的实例,从本篇文章开始我将通过两篇文章带领大家学习一下 RavenDB 常用客户端 API。
Document Store
Document Store 是客户端 API 的主要入口点,它包括了包含所有客户端配置,包括序列化配置、故障转移行为、缓存选项等内容。一般来说每个单例应用程序都会拥有一个Document Store实例,因此 Document Store 是线程安全的,它初始化代码类似于下面这样:
public class DocumentStoreHolder { private readonly static Lazy<IDocumentStore> _store = new Lazy<IDocumentStore>(CreateDocumentStore); private static IDocumentStore CreateDocumentStore() { var documentStore = new DocumentStore { Urls = // urls of the nodes in the RavenDB Cluster { "https://ravendb-01:8080", "https://ravendb-02:8080", "https://ravendb-03:8080", }, Certificate = new X509Certificate2("tasks.pfx"), Database = "Tasks", }; documentStore.Initialize(); return documentStore; } public static IDocumentStore Store { get { return _store.Value; } } }
上面的代码中使用 Lazy 是为了保证 Document Store 只能被创建一次,因此在这里不需要担心线程安全和双重锁定问题。
约定
RavenDB 默认已经做了一些列的约定,这些约定既包含怎么保存内容,也包含如何序列化实体成文文档。在小型项目中使用这些默认的约定基本上已经满足了,但是对于中型项目甚至大型项目来说默认约定就显得有些鸡肋,因此在需要自定约定的情况下,我们可以调用 DocumentStore.Conventions 方法来设置符合项目情况的约定。比如说 RavenDB 默认使用 Id 作为文档内容的 ID ,但是我们并不希望这么做,我们希望使用实体名称加Id的形式来产生ID,那么我们可以这样定义:
documentStore.Conventions.FindIdentityProperty = prop => prop.Name == prop.DeclaringType.Name + "Id";
这个例子只是展现 RavenDB 可以实现自定义约定,更多的属性我将会在后续课程中讲解。
身份验证
身份验证是我们在开发项目时必须要考虑到的问题,RavenDB 完全支持身份认证这个概念。一般来说我们的开发环境是如果用在线上的话是不安全,我们需要以安全的模式在线上环境中运行 RavenDB ,这时我们可以使用 RavenDB 支持的 x509 客户端证书来进行身份验证。这种认证方式表示出于特定原因授予数据库的特定访问权限。X509 是一种自然的验证方式,并且一般来说 X509 客户端证书是基于每个应用程序/角色授予的。具体的身份认证我将会在后面的专题中进行详细讲解。
Tip:默认情况下,RavenDB 会拒绝 localhost 在不安全模式下访问任何内容。这样做是出于安全原因,防止管理员在未经网络身份验证的情况下暴露 RavenDB。如果在禁用身份验证的情况下配置非本地 URL,那么 RavenDB 会显示错误页面,解释情况并提供有关如何解决问题的说明。