3

我有MVCwebApi應用程序與Unity一起使用。我必須將接口ITest解析爲單例類(DelegateHandler)。但是ITest擁有每個httprequest終生管理者,這很重要。所以我不能在Application_Start事件上解決ITest問題,因爲現在沒有HttpRequest,但DelegateHandler只會在httprequest生命週期中使用ITest。Unity懶惰決心

那麼是否有可能將懶惰的決心發送給DelegateHandler,或者也許有人有其他有趣的解決方案?

回答

2

服務的生命週期應該永遠比它的依賴等於或短,所以你通常會註冊ITest爲每HTTP請求或短暫的,但如果這是不可能的,包的依賴(DelegateHandler我假設)有在代理每一個HTTP請求的生命週期:

// Proxy 
public class DelegateHandlerProxy : IDelegateHandler 
{ 
    public Container Container { get; set; } 

    // IDelegateHandler implementation 
    void IDelegateHandler.Handle() 
    { 
     // Forward to the real thing by resolving it on each call. 
     this.Container.Resolve<RealDelegateHandler>().Handle(); 
    } 
} 

// Registration 
container.Register<IDelegateHandler>(new InjectionFactory(
    c => new DelegateHandlerProxy { Container = c })); 
+0

謝謝,非常好的答案! – 2012-04-05 10:59:35

+0

將它轉換成通用的解決方案很酷,但可以propably這是不可能的) – 2012-04-06 07:51:21

0

另一種方法是做到以下幾點:

public class Foo 
{ 
    Func<IEnumerable<ITest>> _resolutionFunc; 
    ITest _test; 
    public Foo(Func<IEnumerable<ITest>> resolutionFunc) 
    { 
     _resolutionFunc=resolutionFunc; 
    } 

private void ResolveFuncToInstance() 
{ 
    _test=_resolutionFunc().First(); 
} 
} 

我們正在做的是要求統一向我們提供的委託,將解決所有ITEST instan ces在容器裏。由於這是一個Func,我們可以在我們想要從Unity中做出實際分辨率時調用它。

這確實很多同樣的事情,史蒂芬是幹什麼的,但使用內置統一的功能做什麼,我們要尋找的。