从我的Configure方法中获取以下代码:
OrmLiteConnectionFactory dbFactory = new OrmLiteConnectionFactory(ConfigUtils.GetConnectionString("Oracle:FEConnection"), OracleOrmLiteDialectProvider.Instance);
container.Register<IDbConnectionFactory>(dbFactory)).ReusedWithin(ReuseScope.Request); // <== this does NOT work
// But these work
container.Register<IPreprocessorRepository>(c => new CachedPreprocessorRepository(dbFactory, c.Resolve<ICacheClient>())).ReusedWithin(ReuseScope.Default);
container.Register<IPreprocessor>(c => new DirectApiPreprocessor(c.Resolve<IPreprocessorRepository>(), c.Resolve<IValidator<LeadInformation>>())).ReusedWithin(ReuseScope.Default);
如何确保每个请求在其他注册中使用dbFactory instanciated?
谢谢你, 斯蒂芬
答案 0 :(得分:1)
您无法更改此范围:
container.Register<IDbConnectionFactory>(dbFactory)
.ReusedWithin(ReuseScope.Request);
因为您只传入对象的实例,而不是工厂函数,因此IOC需要能够实例化对象本身的实例。在这种情况下,所有IOC都可以返回实例,使其成为单例。
为了能够更改范围,您需要注册一个可以创建实例的委托,即:
container.Register<IDbConnectionFactory>(c =>
new OrmLiteConnectionFactory(...))
.ReusedWithin(ReuseScope.Request);
但是你永远不想对任何连接或客户端工厂这样做IDbConnectionFactory
或IRedisClientsManager
,因为它们被设计成用作单身人士。
即。它们是用于创建单个客户端/连接实例的线程安全的单例工厂:
using (var db = container.Resolve<IDbConnectionFactory>().Open())
{
//...
}
using (var redis = container.Resolve<IRedisClientsManager>().GetClient())
{
//...
}