2010-02-27 5 views
3

J'essaie d'utiliser Ninject 2.0 avec une application Web Asp .Net 3.5. Voici les DLL et ses versions que j'utilise.Utilisation de Ninject 2.0 avec ASP .Net 3.5

  • Ninject.dll - v2.0.0.0
  • Ninject.Extensions.Logging.dll v2.0.0.0
  • Ninject.Web.dll v1.0.0.0

En mon global.ascx.cs j'ai la méthode suivante.

protected override IKernel CreateKernel() 
    { 
     IKernel kernel = new StandardKernel();    
     kernel.Bind<IDataAccess>().To<DataAccessEntBlock>().InSingletonScope(); 
     return kernel; 
    } 

Lorsque j'exécute l'application, j'obtiens l'erreur suivante.

Error activating ILoggerFactory 
No matching bindings are available, and the type is not self-bindable. 
Activation path: 
1) Request for ILoggerFactory 

Suggestions: 
1) Ensure that you have defined a binding for ILoggerFactory. 
2) If the binding was defined in a module, ensure that the module has been loaded into the kernel. 
3) Ensure you have not accidentally created more than one kernel. 
4) If you are using automatic module loading, ensure the search path and filters are 

correct.

je ne comprends pas, même si je ne suis pas en train d'enregistrer Logger, il semble qu'il essaie de créer son propre. Comment puis-je résoudre cette erreur? Dois-je utiliser l'extension Logger de Ninject?

Merci GK

+0

Veuillez corriger le formatage (les types génériques sont manquants, utilisez l'aperçu!). Première supposition serait de chercher la suggestion 2 .. –

Répondre

6

L'erreur indique que quelque part, Ninject tente de résoudre l'interface ILoggerFactory à une classe concrète. Sur la base de ce que vous avez indiqué comme références ci-dessus, il semble que vous êtes ASP.Net Web app est basé sur WebForms plutôt que d'une application ASP.Net MVC.

Dans cet esprit, vos pages devraient provenir de PageBase qui est une classe abstraite fournie par la bibliothèque Web Ninject. Cette classe a la définition de la propriété suivante:

[Inject] 
public ILogger Logger { get; set; } 

Par conséquent, lorsque votre page est instancié, Ninject tente d'injecter un enregistreur dans la propriété sur la page. Comme l'erreur l'indique, vous avez besoin d'une liaison définie pour ILoggerFactory ainsi que ILogger; cependant, la seule liaison que vous avez fournie est IDataAccess. Vous devez également charger l'un des modules définis dans la bibliothèque d'extensions de journalisation. Je crois que vous pouvez choisir entre NLog et Log4Net. Ainsi, par exemple, si vous voulez utiliser Log4Net, votre fonction CreateKernel ressemblerait à ceci:

protected override IKernel CreateKernel() 
{ 
    IKernel kernel = new StandardKernel(new Log4netModule());    
    kernel.Bind<IDataAccess>().To<DataAccessEntBlock>().InSingletonScope(); 
    return kernel; 
} 

Cela suppose que vous avez une déclaration using Ninject.Extensions.Logging.Log4net; dans le fichier.

Dans les deux cas, vous devez sélectionner un enregistreur et le charger est des liaisons (via le module) que la bibliothèque Web Ninject exige. Si vous n'avez des problèmes de l'exploitation forestière en ce moment, vous pouvez choisir de fournir des implémentations de ILoggerFactory et ILogger qui ne font rien (par exemple un enregistreur « null ») et lier le votre mannequin ILoggerFactory vous.

+0

parfait. Merci –

1

J'ai eu le même problème. essayer à nouveau référencement ddls log4net.dll, ninject.extensions.logging.dll, ninject.extensions.log4net.dd, ningject.web.dll et ninject.dll cette résolu mon problème. probablement dû à l'ancien fichier log4net.dll.