【问题标题】:Why can't I change the scope of my object with ServiceStacks IoC?为什么我不能使用 ServiceStacks IoC 更改对象的范围?
【发布时间】:2014-11-07 13:36:21
【问题描述】:

鉴于我的 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 用于每个请求的其他注册?

谢谢你, 斯蒂芬

【问题讨论】:

  • 请修正你的标题。
  • 谢谢迈克,真是脑子里放了个屁。

标签: servicestack


【解决方案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())
{
    //...
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-20
  • 1970-01-01
  • 1970-01-01
  • 2021-09-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多