如何配置简单注入器 IoC 以使用 RavenDB

2023-12-21

我在用着简易注射器 http://simpleinjector.codeplex.com用于 MVC 3 Web 应用程序中的 IOC。我在用RavenDB http://ravendb.net用于数据存储。在 mvc 3 应用程序中使用 RavenDB 有几个注意事项。我搜索了一些关于如何连接 IoC 以使用 RavenDB 的信息,但还没有找到如何连接简单的注入器以使用 RavenDB。谁能解释如何连接简单的注入器以在 MVC 3 Web 应用程序中使用 RavenDB?

thanks.


根据RavenDb 教程 http://www.geekbeing.com/2012/01/21/raven-db-tutorial,您的应用程序正好需要一个IDocumentStore实例(我假设每个数据库)。 AIDocumentStore是线程安全的。它产生IDocumentSession实例,它们代表一个工作单元 http://martinfowler.com/eaaCatalog/unitOfWork.html在 RavenDB 中,这些是not线程安全。因此你应该not在线程之间共享会话。

如何设置容器以与 RavenDb 一起使用主要取决于应用程序设计。问题是:你想向消费者注入什么?这IDocumentStore, 或者IDocumentSession?

当你和IDocumentStore,您的注册可能如下所示:

// Composition Root
IDocumentStore store = new DocumentStore
{
    ConnectionStringName = "http://localhost:8080"
 };

store.Initialize();

container.RegisterSingle<IDocumentStore>(store);

消费者可能看起来像这样:

public class ProcessLocationCommandHandler
    : ICommandHandler<ProcessLocationCommand>
{
    private readonly IDocumentStore store;

    public ProcessLocationCommandHandler(IDocumentStore store)
    {
        this.store = store;
    }

    public void Handle(ProcessLocationCommand command)
    {
        using (var session = this.store.OpenSession())
        {
            session.Store(command.Location);

            session.SaveChanges();
        }            
    }
}

因为IDocumentStore被注入后,消费者自己负责管理会话:创建、保存和处置。这对于小型应用程序非常方便,或者例如将 RavenDb 数据库隐藏在存储库 http://martinfowler.com/eaaCatalog/repository.html,你打电话的地方session.SaveChanges()在 - 的里面repository.Save(entity) method.

然而,我发现这种工作单元的使用方式对于较大的应用程序来说是有问题的。所以你可以做的是注入IDocumentSession进入消费者。在这种情况下,您的注册可能如下所示:

IDocumentStore store = new DocumentStore
{
    ConnectionStringName = "http://localhost:8080"
};

store.Initialize();

// Register the IDocumentSession per web request
// (will automatically be disposed when the request ends).
container.RegisterPerWebRequest<IDocumentSession>(
    () => store.OpenSession());

请注意,您需要简单注入器 ASP.NET 集成 NuGet 包 http://nuget.org/packages/SimpleInjector.Integration.Web(或包括SimpleInjector.Integration.Web.dll到您的项目,该项目包含在默认下载中)以便能够使用RegisterPerWebRequest扩展方法。

现在的问题是,去哪里打电话session.SaveChanges()?

有一个关于每个网络请求注册作品单元的问题,这也解决了以下问题SaveChanges。请仔细看看这个答案:每个 Web 请求一个 DbContext……为什么? https://stackoverflow.com/a/10588594/264697。当你替换单词时DbContext with IDocumentSession and DbContextFactory with IDocumentStore,您将能够在 RavenDb 的上下文中阅读它。请注意,也许在使用 RavenDb 时,业务事务或一般事务的概念并不那么重要,但老实说我不知道​​。这是你必须自己去发现的事情。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何配置简单注入器 IoC 以使用 RavenDB 的相关文章

  • CanExecute 何时被调用?

    在演示中 我有一个按钮可以切换布尔字段isAsking 我创建了一个命令 该命令仅在以下情况下执行isAsking true 一旦我按下切换按钮 okButton IsEnable立即更改 这表明该命令发现了更改isAsking 我感到很困
  • C# 属性实际上是方法吗?

    到现在为止 我的印象是Properties Methods在 C 中是两个不同的东西 但后来我做了如下的事情 这对我来说是 大开眼界 我本来期待一处房产stringProp和一种方法stringProp但我得到了这个 为什么会发生这样的事
  • 从 WCF 发送的响应中删除 utf-8 标识符 (BOM)

    我正在用 c 创建 facebook Rest API 的克隆 我正在使用 facebook PHP sdk 对其进行测试 我遇到的问题是我的网络 Rest 服务发送的响应前面包含 utf 8 Bom 并且 Facebook SDK 无法正
  • 从 .NET 应用程序登录 Windows

    我认为它应该是一个Windows服务 当给定某些条件时 它应该执行登录到机器的操作 机器将在 登录屏幕 中检查网络服务 以了解登录时应使用的用户名和密码 这可以吗 我不想要 自动登录 Windows 功能 Thanks AFAIK 无法完成
  • 检查输出是否重定向

    我有一个用 C 编写的控制台应用程序 它处理一些数据然后打印结果 在结果可用之前 会有一个小动画 和不断更新的进度百分比 xx 显然 如果用户重定向我的应用程序的输出 这将被打印到输出重定向到的文本文件中 如果可能的话我想避免这种情况 那么
  • 部署.Net应用程序

    我在部署 net windows 应用程序时确实有某些疑问 部署机器是否需要安装 Net框架 如果不是这样 我的应用程序安装程序 exe 是否包含编译器或类库与设置集成 另外 我可以将我的 net 应用程序部署在除windows 是否支持s
  • ASP.NET 5 未在开发模式下运行

    我已将 ASP NET 5 项目更新为 beta 8 现在我们应该使用以下 Web 命令 commands web Microsoft AspNet Server Kestrel 现在我已经使用环境变量更新了我的项目 这也更新了我的 lau
  • .NET:为什么不检查枚举的范围/值?

    这一直困扰着我 也许对 NET 内部结构有一定了解的人可以向我解释一下 假设我定义一个枚举如下 public enum Foo Eenie 1 Meenie 2 Miney 3 Moe 4 现在 还假设我的代码中的某处有以下代码 int b
  • 指定自定义序列化程序时,错误详细信息未反序列化

    我正在使用自定义XmlObjectSerializer在我的应用程序中 为此 我替换XmlSerializerOperationBehavior with MyOperationBehavior看起来像这样 public class MyO
  • CLR 内部字符串常量吗?

    最近我一直在阅读字符串实习生池的工作原理 然而我一直没能找到这个问题的答案 如果我声明一个常量字符串变量 例如const string STR foo 这是否也会添加到实习生表中 只是为了澄清事情 CLR 不参与字符串驻留 Internin
  • Asp.Net MVC3 - 如何创建动态 DropDownList

    我发现了很多关于此的文章 但我仍然不知道到底如何做到这一点 我正在尝试创建自己的博客引擎 我有用于创建文章的视图 我首先使用 EF 和代码 现在我必须填写应添加文章的类别数量 但我想将其更改为下拉列表 名称为类别 我的模型看起来是这样的 p
  • 使用 ServiceStack JsonSerializer 反序列化包含 Dictionary 属性的类型

    下面的代码片段显示了我可以实现此目的的两种方法 第一个是使用MsgPack https github com msgpack msgpack cli第二个测试是使用ServiceStack 的 JSONSerializer https gi
  • 获取上下文菜单的控制

    我有一个如下所示的上下文菜单 A 1 2 3 选择 1 2 或 3 后 我需要访问调用上下文菜单的对象 意思是如果这是 textbox1 的上下文菜单 那么我需要访问该对象 我该怎么做 忘了说了 这是一个WPF应用程序 所以我使用 Syst
  • TPL架构问题

    我目前正在开展一个项目 我们面临并行处理项目的挑战 到目前为止没什么大不了的 现在来说说问题 我们有一个 ID 列表 我们定期 每 2 秒 为每个 ID 调用一个 StoredProcedure 需要单独检查每个项目的 2 秒 因为它们是在
  • 反对控制反转容器的争论

    似乎每个人都在转向 IoC 容器 我已经尝试 理解 它有一段时间了 尽管我不想成为高速公路上走错路的司机 但它仍然没有通过我的常识测试 让我解释一下 如果我的论点有缺陷 请纠正 启发我 我的理解 IoC 容器应该让您在组合不同组件时变得更轻
  • invalidate方法有什么作用?

    什么是invalidate方法做在winform app Invalidate method附带六超载里面形成control class of System Windows Forms 名称空间 谢谢 Windows 窗体使用 GDI 进行
  • .NET 4.0 迁移后引用 .NET 1.0 程序集的 System.TypeLoadException

    有一个项目从 NET 3 5 迁移到 NET 4 0 该项目有一些对 NET 1 0 程序集的引用 这些程序集是 COM 对象的包装器 这些 NET 1 0 程序集和 COM 对象是外部公司的产品 该项目可以编译 但在运行时 当软件引用这些
  • 使用 Google Calendar API 创建全天活动

    我正在使用 C 和 Google Calendar API 类 CalendarService 和 Event 我想将没有任何日期 全天 的活动上传到 Google 日历 如果我不设置 Event End 属性 则会出现异常 如何将我的活动
  • 读取文件特定行号的有效方法。 (奖励:Python 手册印刷错误)

    我有一个 100 GB 的文本文件 它是来自数据库的 BCP 转储 当我尝试导入它时BULK INSERT 我在第 219506324 行上收到一个神秘错误 在解决此问题之前 我想看看这一行 但可惜的是我最喜欢的方法 import line
  • 回发或回调参数无效。使用“”启用事件验证

    当我从客户端回发页面时 出现以下错误 我有修改客户端 asp ListBox 的 JavaScript 代码 我们该如何解决这个问题 错误详细信息如下 Server Error in XXX Application Invalid post

随机推荐