Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 作用域Neo4j驱动程序和会话对象_C#_.net_Dependency Injection_Neo4j - Fatal编程技术网

C# 作用域Neo4j驱动程序和会话对象

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(_ =&

我目前正处于学习Neo4j的初期,因此我对依赖注入的范围做了很多假设(目前正在Razor Pages应用程序中进行实验)

假设1:驱动程序是一个轻量级协议包装器,在单例范围内是安全的

假设2:将会话限定到web请求生存期可能很有用。例如,我可能想在一些中间件中添加到事务中

以下是一些DI设置示例:

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;
        }
    }
}