1

Tout d'abord je suis un débutant en asp mvc alors s'il vous plaît soyez patient.Custom ControllerFactory avec autofac

Actuellement, je veux créer un projet où autofac sera conteneur IoC je vais réquisitionner usine de contrôleur personnalisé. Dans la fabrique de contrôleurs personnalisés, je veux définir l'implémentation de Data Repository via le constructeur du contrôleur.

Je pensais que cela devrait être fait de cette façon:

ContainerBuilder builder = new ContainerBuilder(); 
     builder.RegisterControllers(asm).InstancePerHttpRequest(); 
     builder.Register(s => new ControllerFactory()).As<IControllerFactory>(); 
     IContainer container = builder.Build(); 

     DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 

Mon contrôleur code usine:

internal class ControllerFactory : DefaultControllerFactory 
{ 
    private readonly Dictionary<string, Func<RequestContext, IController>> _controllerMap; 

    public ControllerFactory() 
    { 
     List<IController> lstControllers = DependencyResolver.Current.GetServices<IController>().ToList(); 
     _controllerMap = new Dictionary<string, Func<RequestContext, IController>>(); 

     foreach (Controller contr in lstControllers) 
     { 
      string ctrName = contr.ControllerContext.RouteData.Values["Controller"].ToString(); 
      _controllerMap.Add(ctrName, c => contr); 
     } 
    } 

    public override IController CreateController(RequestContext requestContext, string controllerName) 
    { 

     if (_controllerMap.ContainsKey(controllerName)) 
     { 
      return _controllerMap[controllerName](requestContext); 
     } 
     else 
      throw new KeyNotFoundException(controllerName); 
    } 
} 

carte contrôleur est vide. Quand je veux résoudre IController je reçois et erreur parce que IController n'est pas reqiseter mais j'ai utilisé RegisterControllers dans le constructeur autofac.

Pourriez-vous m'expliquer comment le faire de la bonne façon?

Répondre

1

Étant donné que vous résolvez des contrôleurs via des interfaces, utilisez la méthode AsImplementedInterfaces pour enregistrer les contrôleurs.

builder.RegisterControllers(asm).AsImplementedInterfaces() 
    .InstancePerHttpRequest(); 
+0

Merci pour votre réponse. Cela résout tous mes problèmes. Même sur un exemple sur le wiki autofac, il n'y a pas d'exemple. – Marek

+1

@Marek Bien. Vous pouvez marquer ceci comme la réponse acceptée. – Eranga

+0

'InstancePerHttpRequest' est obsolète. Vous pouvez simplement utiliser 'InstancePerRequest'. – Dejan