Microsoft.扩展.依赖注入问题



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

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

这是我目前拥有的代码:

namespace DependencyInjection.Interfaces
{
public interface IDatabaseSessionRepository
{
IDriver Driver { get; set; }
void IDatabaseSessionRepository();
ISession newSession();
}
public interface IDatabaseRepository
{
ISession Session { get; set; }
void IDatabaseRepository();
}
}

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 实例。

我的想法是我可以使用这些服务。AddSingleton<>() 在 DatabaseSessionRepository 上,但是如何只实例化一次并且能够在 DatabaseRepository 类中访问呢?

我也会使用这些服务。DatabaseRepository 的 AddScoped<>() 生存期只是为了让你知道。

那不是更容易吗?

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

public class MyController : Controller
{
private readonly ISession _session;
public MyController(ISession session)
{
_session = session;
}
}

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

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

最新更新