1

我已将 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 对象仅在请求的时间段内保留并在以后准备好收集?

4

1 回答 1

2

您使用委托注入来解决此问题。

public class StayOnTillAppDies : IStayOnTillAppDies
{
    private readonly Func<IDiesWhenRequestObjectDies> resolver;

    public StayOnTillAppDies(Func<IDiesWhenRequestObjectDies> resolver)
    {
        this.resolver = resolver;
    }
}

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

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>()));
    });
于 2013-10-18T10:57:12.110 回答