2011-09-21 2 views
3

J'ai quelques problèmes avec le gestionnaire de durée de vie dans l'unité, il utilise l'objet comme son singleton, mais dans la configuration je l'ai mis à "PerWebRequest".Une seule instance du contrôleur 'TestController' ne peut pas être utilisée pour gérer plusieurs requêtes

L'erreur est: Une seule instance du contrôleur 'TestController' ne peut pas être utilisée pour gérer plusieurs demandes. Si une fabrique de contrôleurs personnalisée est utilisée, assurez-vous qu'elle crée une nouvelle instance du contrôleur pour chaque requête.

Le code PerWebRequest:

public class UnityPerWebRequestLifetimeManager : LifetimeManager 
{ 
    private HttpContextBase _httpContext; 

    public UnityPerWebRequestLifetimeManager() 
     : this(new HttpContextWrapper(HttpContext.Current)) 
    { 
    } 

    public UnityPerWebRequestLifetimeManager(HttpContextBase httpContext) 
    { 
     _httpContext = httpContext; 
    } 

    private IDictionary<UnityPerWebRequestLifetimeManager, object> BackingStore 
    { 
     get 
     { 
      _httpContext = (HttpContext.Current != null) ? new HttpContextWrapper(HttpContext.Current) : _httpContext; 

      return UnityPerWebRequestLifetimeModule.GetInstances(_httpContext); 
     } 
    } 

    private object Value 
    { 
     [DebuggerStepThrough] 
     get 
     { 
      IDictionary<UnityPerWebRequestLifetimeManager, object> backingStore = BackingStore; 

      return backingStore.ContainsKey(this) ? backingStore[this] : null; 
     } 

     [DebuggerStepThrough] 
     set 
     { 
      IDictionary<UnityPerWebRequestLifetimeManager, object> backingStore = BackingStore; 

      if (backingStore.ContainsKey(this)) 
      { 
       object oldValue = backingStore[this]; 

       if (!ReferenceEquals(value, oldValue)) 
       { 
        IDisposable disposable = oldValue as IDisposable; 

        if (disposable != null) 
        { 
         disposable.Dispose(); 
        } 

        if (value == null) 
        { 
         backingStore.Remove(this); 
        } 
        else 
        { 
         backingStore[this] = value; 
        } 
       } 
      } 
      else 
      { 
       if (value != null) 
       { 
        backingStore.Add(this, value); 
       } 
      } 
     } 
    } 

    [DebuggerStepThrough] 
    public override object GetValue() 
    { 
     return Value; 
    } 

    [DebuggerStepThrough] 
    public override void SetValue(object newValue) 
    { 
     Value = newValue; 
    } 

    [DebuggerStepThrough] 
    public override void RemoveValue() 
    { 
     Value = null; 
    } 
} 

Le contrôleur:

public class TestController : Controller 
{ 
    // 
    // GET: /Test/ 

    public TestController() 
    { 

    } 

    public ActionResult Index() 
    { 
     return View(); 
    } 

    public ActionResult RadioButtonList() 
    { 
     return View("TestControl"); 
    } 
} 

Le contrôleur usine:

public class ControllerFactory : DefaultControllerFactory 
{ 
    protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType) 
    { 
     return (controllerType == null) ? base.GetControllerInstance(requestContext, controllerType) : IoC.Resolve<IController>(controllerType); 
    } 
} 

Et dans l'une des vues que je suis en train de l'utiliser comme ceci :

...

<% Html.RenderAction<TestController>(c => c.RadioButtonList()); %> 

         <% Html.RenderAction<TestController>(c => c.RadioButtonList()); %> 

...

Je ne sais pas ce qui ne va pas ici?

Merci.

Répondre

3

Les deux demandes de contrôleur d'unité sont créées dans la même requête/réponse HTTP, d'où la même instance. Vous devez basculer pour que les contrôleurs aient une durée de vie transitoire.

Je passerais à DependencyResolver au lieu d'utiliser ControllerFactory puisque vous utilisez MVC3.

+0

Mais le contrôleur est réglé sur Durée de vie transitoire. Alors, comment puis-je le configurer pour répondre à plus d'une requête pour le même contrôleur dans la même requête HTTP? Merci ... – may215

+0

essayez de passer à DependencyResolver, peut-être quelque chose avec votre usine de contrôleur. – jgauffin

+0

Je l'ai fait, mais, je reçois toujours le même problème, peut-être que j'ai besoin de vérifier si le type est déjà enregistré alors, je vais sauter la résolution pour le même type à nouveau? – may215

Questions connexes