2013-05-08 2 views
6

Sto rielaborando un codice esistente per fare un uso migliore del contenitore autofac. La situazione che sto vivendo è che un sacco di cose usate per risolvere i loro componenti direttamente dal contenitore in un classico anti-pattern ServiceLocator. Sono in procinto di introdurre adeguati schemi di unità di lavoro utilizzando LifetimeScope.Controllare se il componente è stato risolto nell'ultimo ciclo LifetimeScope

Il problema che sto affrontando è che qualche componente deve essere risolto da un bambino LifetimeScope quanto stanno attuando IDisposable e deve essere smaltito. Se sono risolti nell'ambito della radice che non accadrà mai.

Esiste un modo per impedire che alcuni componenti vengano risolti nell'ambito della radice? Crashing runtime è OK per questo, dal momento che sto esaminando questi casi uno per uno e introducendo gli ambiti necessari. L'unico modo che posso pensare di fare questo è creare un piccolo componente fittizio che viene risolto una volta per l'ambito di vita principale e risolto in .InstancePerLifetimeScope(), memorizzandolo staticamente da qualche parte. Quindi, quando un componente successivo viene risolto, otterrò uno di quei componenti fittizi e vedrò se si tratta della stessa istanza di quella che va in ambito root. È un po 'goffo, e c'è un modo migliore?

risposta

1

Si potrebbe provare a utilizzare 'per corrispondenza portata vita' di registrazione:

containerBuilder.RegisterType<Foo>() 
       .As<IFoo>() 
       .InstancePerMatchingLifetimeScope("scope"); 

In questo modo IFoo possono essere risolti solo quando almeno un ambito antenato corso della vita è un ambito di vita con tag e il suo cartellino è uguale "scope". Solitamente l'ambito della durata di root non viene taggato, quindi quando si tenta di risolvere IFoo da esso, Autofac genererà un'eccezione.

Vedere the Autofac wiki per ulteriori informazioni.