2011-10-20 3 views
3

Je veux o lier mon contrôleur avec un paramètre qui est évalué paresseux.MVC 3 ninject lier paresseux évalué paramètre

protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 
    { 
     try 
     { 
      return controllerType == null 
         ? null 
         : (IController) _ninjectKernel.Get(controllerType); 
     } 
     catch (Exception ex) 
     { 
      throw; 
     } 
    } 

et moi avons la prochaine liaison:

_ninjectKernel.Bind<IFilesRepository>().To<FilesManager>().WithConstructorArgument("storageFolderAbsolutePath", c => c.ToString()); 

Le problème est à la fonction lambda. Je veux retourner Server.MapPath ("/") ... mais je n'ai pas le contexte de demande dans l'objet c. Comment puis-je l'envoyer?

Répondre

1

Je ne suis pas trop familier avec Ninject, mais vous devriez être en mesure d'enregistrer un fournisseur avec le conteneur pour pouvoir résoudre un HttpContextBase. Ce faisant, le IFilesRepository peut maintenant prendre un HttpContextBase comme argument constructeur, qui sera injecté par le conteneur, en utilisant le fournisseur, lors de la création d'une instance de IFilesRepository.

Pour enregistrer un fournisseur (en utilisant un délégué pour résoudre le service),

Bind<HttpContextBase>().ToMethod(context => new HttpContextWrapper(HttpContext.Current)); 

Sachez cependant que le style de vie d'un IFilesRepository aurait probablement besoin de passer à un mode de vie « par demande Web » , étant donné que le HttpContext.Current est créé par requête Web, vous ne voudriez pas vous en tenir à un IFilesRepository ayant un style de vie plus long. Vous voudrez peut-être faire abstraction de la fonctionnalité "mapping paths" pour avoir un IFilesRepository avec un style de vie plus long.

0

Depuis la variable serveur est lié au HttpContext actuel, vous devrez récupérer à l'intérieur de la classe FilesManager (à l'aide d'une interface distincte à cette fin si vous)

Questions connexes