【问题标题】:StructureMap PerRequest object injected into Singleton memory scope?StructureMap PerRequest 对象注入 Singleton 内存范围?
【发布时间】:2013-10-18 18:57:12
【问题描述】:

我已将 2 个对象实例配置到结构映射中

x.ForRequestedType<IStayOnTillAppDies>().TheDefaultIsConcreteType<StayOnTillAppDies>().CacheBy(InstanceScope.Singleton);

x.ForRequestedType<IDiesWhenRequestObjectDies>().TheDefaultIsConcreteType<DiesWhenRequestObjectDies>().CacheBy(InstanceScope.PerRequest);

如您所见,一个是单例/共享范围的对象,而另一个是 PerRequest。

单例对象 StayOnTillAppDies 将保持活动状态直到应用程序被杀死,而 PerRequest 对象 DiesWhenRequestObjectDies 应该在请求范围死亡时从内存中清除。

我需要在 StayOnTillAppDies 中使用对象 DiesWhenRequestObjectDies,以便使用构造函数注入相应地对其进行注入。

public class StayOnTillAppDies : IStayOnTillAppDies 
{
  private readonly IDiesWhenRequestObjectDies   _diesWhenRequestObjectDies;

  public StayOnTillAppDies (IDiesWhenRequestObjectDies diesWhenRequestObjectDies)
  {                       
    _diesWhenRequestObjectDies = diesWhenRequestObjectDies;
  }

  ....
  ....
  ....
}

_diesWhenRequestObjectDies 仅在 StayOnTillAppDies 中的一两个地方需要,但这里注入的对象永远不会被释放,因为 StayOnTillAppDies 是单例范围。

我们如何处理这个问题以确保 PerRequest 对象仅在请求的时间段内保留并在以后准备好收集?

【问题讨论】:

    标签: c# dependency-injection inversion-of-control structuremap


    【解决方案1】:

    你使用委托注入来解决这个问题。

    public class StayOnTillAppDies : IStayOnTillAppDies
    {
        private readonly Func<IDiesWhenRequestObjectDies> resolver;
    
        public StayOnTillAppDies(Func<IDiesWhenRequestObjectDies> resolver)
        {
            this.resolver = resolver;
        }
    }
    

    当您需要IDiesWhenRequestObjectDies 的实例时,在StayOnTillAppDies 类中使用以下代码

    IDiesWhenRequestObjectDies instance = this.resolver();
    

    这是我用来设置的配置。

    IContainer container = new Container(x =>
        {
            x.ForRequestedType<IStayOnTillAppDies>()
                .TheDefaultIsConcreteType<StayOnTillAppDies>()
                .CacheBy(InstanceScope.Singleton);
    
            x.ForRequestedType<IDiesWhenRequestObjectDies>()
                .TheDefaultIsConcreteType<DiesWhenRequestObjectDies>()
                .CacheBy(InstanceScope.PerRequest);
        });
    
    container.Configure(x =>
        {
            x.SelectConstructor<StayOnTillAppDies>(() =>
                new StayOnTillAppDies(() => 
                    container.GetInstance<IDiesWhenRequestObjectDies>()));
        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-29
      • 1970-01-01
      • 2017-03-20
      • 1970-01-01
      • 1970-01-01
      • 2011-06-12
      • 2017-01-01
      相关资源
      最近更新 更多