首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Microsoft.Extension.Dependencyinjection问题

Microsoft.Extension.Dependencyinjection问题
EN

Stack Overflow用户
提问于 2017-05-27 11:51:49
回答 1查看 758关注 0票数 0

我正在用AspNetCore1.1制作一个RESTfull API,这是我第一次使用net,我变得相当困惑。

我需要从我的应用程序中访问一个neo4j数据库,但是我只需要设置一次到数据库的连接,这样我就不必对每个请求重新连接到数据库。因此,我已经创建了一个类,它将处理建立连接的问题,然后有一个newSession()方法,它将非常明显地返回一个新的ISession实例,我可以用该实例查询数据库。

这是我目前拥有的代码:

代码语言:javascript
复制
namespace DependencyInjection.Interfaces
{
    public interface IDatabaseSessionRepository
    {
        IDriver Driver { get; set; }

        void IDatabaseSessionRepository();

        ISession newSession();
    }

    public interface IDatabaseRepository
    {
        ISession Session { get; set; }

        void IDatabaseRepository();
    }
}

代码语言:javascript
复制
namespace DependencyInjection.Methods
{ 
    public class DatabaseSessionRepository : IDatabaseSessionRepository
    {
        public IDriver Driver { get; set; }

        public void IDatabaseSessionRepository()
        {
            Driver = GraphDatabase.Driver("bolt://localhost:8797", AuthTokens.Basic("neo4j", "neo4j"));

        }

        public ISession newSession()
        {
            return Driver.Session();
        }
    }

    public class DatabaseRepository : IDatabaseRepository
    {
        public ISession Session { get; set; }

        public void IDatabaseRepository()
        {
            //I want to access an instance of the DatabaseSessionRepository class
            //here 
        }

        //other methods here
    }
}

我希望有一个DatabaseSessionRepository实例,并且能够在DatabaseRepository类中访问它,这样我就可以获得ISession实例。

我想的是我可以在DatabaseSessionRepository上使用DatabaseSessionRepository(),但是如何在DatabaseRepository类中实例化它一次并能够访问呢?

我还将使用services.AddScoped<>()生命周期来处理DatabaseRepository,就像您知道的那样。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-27 12:22:02

那不是更容易吗?

代码语言:javascript
复制
services.AddSingleton<IDriver>(p => GraphDatabase.Driver("bolt://localhost:8797", AuthTokens.Basic("neo4j", "neo4j"));
services.AddScoped<ISession>(p => p.GetService<IDriver>().Session());

这确保在整个应用程序生存期内只创建一个IDriver实例,并且每次请求ISession时,它都被解析为一个作用域服务(整个请求的单个ISession ),然后再进行处理。

然后,您可以在任何控制器中注入ISession

代码语言:javascript
复制
public class MyController : Controller
{
    private readonly ISession _session;
    public MyController(ISession session)
    {
        _session = session;
    }
}

当然,在DI容器内注册的任何其他类中:

代码语言:javascript
复制
// inside ConfigureServices:    
services.AddScoped<IDatabaseRepository, DatabaseRepository>();

// your class:
public class DatabaseRepository : IDatabaseRepository
{
    public ISession Session { get; set; }

    public DatabaseRepository(ISession session)
    {
        Session = session;
    }

    //other methods here
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44216507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档