我正在用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
}