2010-04-20 4 views
1

Je suis en train de résoudre le AccountController dans ma demande, mais il semble que j'ai un problème de cadrage à vie.problème avec HttpRequestScoped dans Autofac

builder.Register(c => new MyDataContext(connectionString)).As<IDatabase>().HttpRequestScoped(); 
builder.Register(c => new UnitOfWork(c.Resolve<IDatabase>())).As<IUnitOfWork>().HttpRequestScoped(); 
builder.Register(c => new AccountService(c.Resolve<IDatabase>())).As<IAccountService>().InstancePerLifetimeScope(); 
builder.Register(c => new AccountController(c.Resolve<IAccountService>())).InstancePerDependency(); 

J'ai besoin MyDataContext et UnitOfWork à scope au HttpRequestLevel. Lorsque je tente de résoudre le AccountController, je reçois l'erreur suivante:.

Aucune étendue correspondant à l'expression « valeur (+ Autofac.Builder.RegistrationBuilder`3 <> c__DisplayClass0 [...]) lifetimeScopeTag.Equals (portée .Tag) 'est visible depuis la portée dans laquelle l'instance a été demandée.

Dois-je mes vies de dépendance mis en place correctement?

+0

De quelle portée vous résoudre le AccountController? –

Répondre

1

Votre configuration semble bien - je suppose que le problème est que vous essayez de résoudre AccountController (manuellement?) De IContainerProvider.ApplicationContainer.

Vous devez résoudre les dépendances d'une application web de IContainerProvider.RequestLifetime (RequestContainer 1.x).

Avez-vous essayé l'intégration Autofac ASP.NET MVC? Il prendrait soin de cela pour vous.

+0

Je n'ai toujours pas résolu mon problème, mais cela en faisait partie. Je commence une nouvelle question. Merci! –

0

j'ai eu la même erreur. Je l'ai résolu en déplaçant les instructions d'inscription à la section Application_BeginRequest dans Global.asax.cs

builder.Register(c => new MyDataContext(connectionString)).As<IDatabase>().SingleInstance(); 
builder.Register(c => new UnitOfWork(c.Resolve<IDatabase>())).As<IUnitOfWork>().SingleInstance(); 
builder.Register(c => new AccountService(c.Resolve<IDatabase>())).As<IAccountService>(); 
builder.Register(c => new AccountController(c.Resolve<IAccountService>()))); 

J'ai la disposition du conteneur:

protected void Application_EndRequest() 
{ 
    ContainerProvider.EndRequestLifetime(); 
}