使用Autofac注册RavenDb?

使用Autofac注册RavenDb?,ravendb,autofac,Ravendb,Autofac,有人能告诉我如何使用Autofac注册RavenDB吗 builder.Register(。然后呢?下面是一个示例控制台程序,它不仅演示了如何连接文档存储,还演示了如何设置它,以便您可以插入文档会话: 使用System.Threading.Tasks; 使用Autofac; 使用Raven.Client; 使用Raven.Client.Document; 命名空间控制台应用程序1 { 内部课程计划 { 私有静态void Main() { var builder=new ContainerBuil

有人能告诉我如何使用Autofac注册RavenDB吗


builder.Register(
。然后呢?

下面是一个示例控制台程序,它不仅演示了如何连接文档存储,还演示了如何设置它,以便您可以插入文档会话:

使用System.Threading.Tasks;
使用Autofac;
使用Raven.Client;
使用Raven.Client.Document;
命名空间控制台应用程序1
{
内部课程计划
{
私有静态void Main()
{
var builder=new ContainerBuilder();
//将文档存储注册为单个实例,
//第一次使用时初始化它。
builder.Register(x=>
{
var store=newdocumentstore{Url=”http://localhost:8080" };
store.Initialize();
退货店;
})
.As()
.SingleInstance();
//注册会话,在每个生存期作用域中打开一个新会话。
builder.Register(x=>x.Resolve().OpenSession())
.As()
.InstancePerLifetimeScope()实例
.OnRelease(x=>
{
//释放作用域后,保存更改
//在处理会话之前。
x、 保存更改();
x、 处置();
});
//注册您认为合适的其他服务
builder.RegisterType().As();
var container=builder.Build();
//模拟一些活动。5个用户同时下订单。
对于(0,5,i=>
{
//每个用户都有自己的作用域
//一个新的入站呼叫,如web请求,您将允许
//autofac插件创建范围,而不是手动创建。
使用(var scope=container.BeginLifetimeScope())
{
//让我们来吧。再说一次,在现实世界中,你只需要注射
//您的服务已连接到某些东西,如MVC
//控制器。在这里,我们将手动解析服务。
var orderService=scope.Resolve();
orderService.PlaceOrder();
}
});
}
}
//定义订单服务
公共接口服务
{
作废定单();
}
公共类OrderService:IOrderService
{
私有只读IDocumentSession\u会话;
//注意会话是如何被注入构造函数的
公共医嘱服务(IDocumentSession会话)
{
_会话=会话;
}
公共秩序
{
_session.Store(新订单{Description=“Stuff”,总计=100.00m});
//我们不必在这里调用.SaveChanges(),因为我们正在这样做
//在会话的生存期范围内全局执行。
}
}
//只是一些保存到raven中的样本。
公共阶级秩序
{
公共字符串Id{get;set;}
公共字符串说明{get;set;}
公共十进制总数{get;set;}
}
}
请注意,DocumentStore是单个实例,但DocumentSession是每个生存期范围的实例。对于此示例,我手动创建生存期范围并并行执行,模拟5个不同的用户如何同时下订单。他们每个人都将获得自己的会话

在OnRelease事件中放置SaveChanges是可选的,但可以避免将其放置在每个服务中

在现实世界中,这可能是一个web应用程序,也可能是一个服务总线应用程序,在这种情况下,您的会话应该分别限定为单个web请求或消息的生存期

如果您使用的是ASP.Net WebApi,您应该从NuGet获取Autofac.WebApi包,并使用其.instancePerapireRequest()方法,该方法会自动创建适当的生存期范围。

这里有一个相关问题:。它谈到了简单的注入器,但对于Autofac来说基本相同。