2013-05-08 14 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.

Problemi correlati