Domanda

Sto indagando sull'uso di Autofac nella nostra applicazione web che in precedenza aveva usato Castle Windsor in passato.

La cosa che mi piace molto di Autofac è la capacità di esprimere la costruzione dinamica di componenti attraverso espressioni lamda, al contrario di creare DependancyResolvers ecc. in Windsor.

Uno scenario che ho è che voglio che un particolare componente venga registrato nell'ambito di livello di sessione ASP.NET. Con Windsor avrei creato / creato un nuovo LifestyleManager, tuttavia con Autofac ho pensato a questo:

//Register SessionContext at HTTP Session Level
builder.Register(c =>
{
    HttpContext current = HttpContext.Current;

    //HttpContext handes delivering the correct session
    Pelagon.Violet.Core.Interfaces.SessionContext instance = current.Session["SessionContext"] as Pelagon.Violet.Core.Interfaces.SessionContext;

    if (instance == null)
    {
        instance = c.Resolve<Pelagon.Violet.Core.Interfaces.SessionContext>();
        current.Session["SessionContext"] = instance;
    }

    return instance;
})
.FactoryScoped();

Che ad un certo punto potrei essere in grado di trasformare in un metodo di estensione. Accetto che questa implementazione bomba se HttpContext.Current.Session è nullo in quanto dovrebbe essere utilizzato solo in un'app Web.

La domanda è:

Qual è la migliore pratica per tale registrazione in Autofac. Ho visto molte menzioni sull'uso di contenitori nidificati, ecc., Ma nessun esempio concreto, e sono ansioso di capire cosa potrebbe esserci di sbagliato nell'approccio sopra (l'unica cosa a cui riesco a pensare è la roba di smaltimento automatico).

Grazie.

È stato utile?

Soluzione

Sembra perfetto.

Contrassegnando il componente 'ExternallyOwned ()', Autofac non chiamerà Dispose () su di esso.

Gli unici aspetti qui riportati sono che il componente con ambito sessione potrebbe risolvere le proprie dipendenze tramite il contenitore corrente e quindi contenere riferimenti a elementi che potrebbero appartenere alla richiesta corrente (ad esempio.) Questo dovrebbe essere facile da individuare test però.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top