MVC 3 paramètre évalué ninject se lient paresseux
-
27-10-2019 - |
Question
Je veux o lier mon contrôleur avec un paramètre qui est paresseux évalué.
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
try
{
return controllerType == null
? null
: (IController) _ninjectKernel.Get(controllerType);
}
catch (Exception ex)
{
throw;
}
}
J'ai la prochaine reliure:
_ninjectKernel.Bind<IFilesRepository>().To<FilesManager>().WithConstructorArgument("storageFolderAbsolutePath", c => c.ToString());
Le problème est à la fonction lambda. Je veux revenir Server.MapPath ( « / ») ... mais je n'ai pas le contexte de la demande dans l'objet c. Comment puis-je l'ai envoyé?
La solution
Je ne suis pas trop familier avec Ninject, mais vous devriez être en mesure d'enregistrer un fournisseur avec le conteneur pour être en mesure de résoudre un HttpContextBase
. Ce faisant, le IFilesRepository
peut maintenant prendre une HttpContextBase
comme argument du 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 », comme le HttpContext.Current
est créé par requête web, de sorte que vous ne voudriez pas aller maintenant sur que un IFilesRepository
qui avait un style de vie plus longue. Vous voudrez peut-être abstraite sur la fonctionnalité « chemins mapping » afin que vous puissiez avoir un IFilesRepository
avec un style de vie plus longue.
Autres conseils
Depuis la variable serveur est lié au courant HttpContext vous devrez récupérer à l'intérieur de la classe FilesManager (à l'aide d'une interface distincte à cette fin si vous voulez)