3

Ich habe MVCwebApi Anwendung, die mit Unity arbeitet. Ich muss Schnittstelle ITest zu Singleton-Klasse (DelegateHandler) auflösen. Aber Schnittstelle ITest hat per httprequest Lifetime Manager und es ist wichtig. So kann ich ITest auf Application_Start Ereignis nicht auflösen, weil es nicht HttpRequest jetzt gibt, aber DelegateHandler ITest nur im httprequest Lebenszyklus verwendet.Einheit Lazy Entschlossenheit

So ist es möglich, faule Entschlossenheit zu DelegateHandler zu senden oder vielleicht jemand andere interessante Lösung?

Antwort

2

Die Lebensdauer eines Dienstes sollte immer gleich oder kürzer sein als die seiner Abhängigkeiten. Daher würden Sie normalerweise ITest als Pro HTTP-Anforderung oder Transient registrieren, aber wenn das nicht möglich ist, wickeln Sie die Abhängigkeit (DelegateHandler ich nehme an) eine pro Http Lebensdauer Anfrage in einem Proxy:

// 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

Danke, sehr nette Antwort! –

+0

Wäre cool, um es generische Lösung zu konvertieren, aber wahrscheinlich ist es unmöglich) –

0

eine weitere Option ist, folgendes zu tun:

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

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

Was wir tun, Unity bittet uns mit einem Delegierten zu schaffen, die alle ITest lösen wird instan im Container. Da dies ein Func ist, können wir es aufrufen, wenn wir die aktuelle Auflösung von Unity machen wollen.

Dies funktioniert ähnlich wie Steven, nutzt aber eingebaute Unity-Funktionen, um das zu tun, wonach wir suchen.