为什么我不能使用ServiceStacks IoC更改对象的范围?

时间:2014-11-07 03:18:01

标签: servicestack

从我的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?

谢谢你, 斯蒂芬

1 个答案:

答案 0 :(得分:1)

您无法更改此范围:

container.Register<IDbConnectionFactory>(dbFactory)
    .ReusedWithin(ReuseScope.Request);

因为您只传入对象的实例,而不是工厂函数,因此IOC需要能够实例化对象本身的实例。在这种情况下,所有IOC都可以返回实例,使其成为单例。

为了能够更改范围,您需要注册一个可以创建实例的委托,即:

container.Register<IDbConnectionFactory>(c => 
      new OrmLiteConnectionFactory(...))
    .ReusedWithin(ReuseScope.Request);

但是你永远不想对任何连接或客户端工厂这样做IDbConnectionFactoryIRedisClientsManager,因为它们被设计成用作单身人士。

即。它们是用于创建单个客户端/连接实例的线程安全的单例工厂:

using (var db = container.Resolve<IDbConnectionFactory>().Open())
{
    //...
}

using (var redis = container.Resolve<IRedisClientsManager>().GetClient())
{
    //...
}