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.
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
essayez de passer à DependencyResolver, peut-être quelque chose avec votre usine de contrôleur. – jgauffin
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