1

我已經配置2對象實例成structuremapStructureMap注入Singleton內存作用域的PerRequest對象?

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

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

正如你可以看到一個是單/共享範圍的對象,而另一個是PerRequest。直到同時PerRequest對象DiesWhenRequestObjectDies應該從內存中獲取清除時請求範圍死亡的應用被殺死

Singleton對象StayOnTillAppDies會活下去。

我需要在StayOnTillAppDies中使用對象DiesWhenRequestObjectDies,以便使用構造函數注入相應地注入它。

public class StayOnTillAppDies : IStayOnTillAppDies 
{ 
    private readonly IDiesWhenRequestObjectDies _diesWhenRequestObjectDies; 

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

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

_diesWhenRequestObjectDies只需要在StayOnTillAppDies一個或兩個地方,但這裏注入對象將永遠不會得到釋放,因爲StayOnTillAppDies是辛格爾頓範圍。

我們該如何處理這個問題,以確保PerRequest對象僅在請求的時間段內保留,並在稍後準備好收集?

回答

2

您使用委託注入來解決此問題。

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

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

,當你需要的IDiesWhenRequestObjectDies

IDiesWhenRequestObjectDies instance = this.resolver(); 

一個實例這是我用來設置它的配置使用下面的代碼StayOnTillAppDies類。

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>())); 
    }); 
+0

聽起來不錯。謝謝! – user2385841

相關問題