C# 作用域Neo4j驱动程序和会话对象
我目前正处于学习Neo4j的初期,因此我对依赖注入的范围做了很多假设(目前正在Razor Pages应用程序中进行实验) 假设1:驱动程序是一个轻量级协议包装器,在单例范围内是安全的 假设2:将会话限定到web请求生存期可能很有用。例如,我可能想在一些中间件中添加到事务中 以下是一些DI设置示例:C# 作用域Neo4j驱动程序和会话对象,c#,.net,dependency-injection,neo4j,C#,.net,Dependency Injection,Neo4j,我目前正处于学习Neo4j的初期,因此我对依赖注入的范围做了很多假设(目前正在Razor Pages应用程序中进行实验) 假设1:驱动程序是一个轻量级协议包装器,在单例范围内是安全的 假设2:将会话限定到web请求生存期可能很有用。例如,我可能想在一些中间件中添加到事务中 以下是一些DI设置示例: public void ConfigureServices(IServiceCollection services) { services .AddSingleton(_ =&
public void ConfigureServices(IServiceCollection services)
{
services
.AddSingleton(_ => GraphDatabase.Driver("bolt://localhost:7687", AuthTokens.Basic("neo4j", "hubdb")))
.AddScoped(_ => _.GetRequiredService<IDriver>().Session())
.AddRazorPages();
}
您能确认或评论我的假设吗?参考
假设1:驱动程序是一个轻量级协议包装器,在单例范围内是安全的
简短回答:是
来自文档
驱动程序对象
Neo4j客户端应用程序需要一个驱动程序实例来
提供对数据库的访问。这个驱动程序应该是可用的
应用程序中需要与Neo4j交互的所有部分In
如果线程安全是一个问题,那么驱动程序可以
被认为是线程安全的。
关于生命周期的注记
应用程序通常会在启动时构造一个驱动程序实例,并在退出时销毁它。消灭司机
实例将立即关闭以前打开的所有连接
通过那个司机;对于包含连接池的驱动程序
整个游泳池将被关闭
我的
假设2:将会话范围限定到web请求生存期可能很有用。例如,我可能想在一些中间件中添加到事务中 简短回答:是 从文件中 会议 会话是一系列事务的容器。会议 根据需要从池中借用连接,因此应予以考虑 重量轻,一次性使用。在以线程安全为核心的语言中 问题,会话不应被视为线程安全的<语言中的strong> 支持它们的会话通常在上下文块中确定范围。 这可确保它们已正确关闭,且任何基础 连接已释放且未泄漏
emphasis mine您有机会查看此文档吗谢谢您的链接,非常感谢,我还没有找到
public class SignupVendor
{
private readonly ISession session;
public SignupVendor(ISession session)
{
this.session = session;
}
public async Task RunAsync(string name)
{
using var transaction = await session.BeginTransactionAsync();
try
{
var result = await transaction.RunAsync(
"CREATE (v:Vendor {name:$name}) RETURN v",
new { name });
await transaction.CommitAsync();
}
catch
{
await transaction.RollbackAsync();
throw;
}
}
}