2017-01-26 2 views
1

Lorsque j'essaie de créer un nouveau IRepository<Tag> en utilisant kernel.Get, Ninject lève une exception. Est-ce que j'utilise Ninject correctement et les fixations sont-elles correctement configurées?Ninject ne peut pas créer d'objet. Exception levée lors de l'obtention du noyau

Méthode de classe NinjectDependencyResolver:

private void AddBindings() 
     { 
      var mapperConfiguration = new MapperConfiguration(cfg => 
      { 
       cfg.AddProfile(new TagProfile()); 
      }); 
      var mapper = mapperConfiguration.CreateMapper(); 
      _kernel.Bind<BlogDbContext>().ToSelf().InRequestScope(); 
      _kernel.Bind<IRepository<Tag>, Repository<Tag>>(); 
      _kernel.Bind<IMapper>().ToConstant(mapper); 

      var repository = _kernel.Get<IRepository<Tag>>(); // exception thrown here 
      _kernel.Bind<ITagService, TagService>(); 
     } 

Classe Repository:

`public class Repository<T> : IRepository<T> where T : class 
{ 
    private readonly BlogDbContext _db; 

    public Repository(BlogDbContext db) 
    { 
     _db = db; 
    } 
}` 

post-scriptum. Je ne sais pas si c'est important, mais son référentiel d'interface se trouve dans le même assemblage, et l'enregistrement de Ninject dans un autre.

+0

Vous liez la 'BlogDbContext' portée de la demande, mais lorsque vous appelez' AddBindings', vous êtes dans un champ de demande? – mason

+0

@mason, désolé, je ne comprends pas ce que vous voulez dire. Mais quand j'essaye 'InSingletonScope() \t' tout fonctionne bien. Mais Singleton ne voudrait pas utiliser. – Lightness

+0

Une requête est une requête HTTP, comme un client accédant à une page. Lorsque vous définissez la durée de vie de vos dépendances, vous pouvez faire en sorte que l'objet soit vivant uniquement pour cette requête particulière, ce qui correspond à la façon dont vous l'avez actuellement. Mais cela signifie que la dépendance ne pourra pas être résolue en dehors d'une requête, donc plus tard quand elle a essayé d'obtenir un 'IRepository ' elle ne peut pas satisfaire le constructeur pour 'Repository '. Ou du moins c'est ma conjecture quant à ce qui se passe. – mason

Répondre

2

Votre syntaxe de liaison est incorrecte. Changer:

_kernel.Bind<IRepository<Tag>, Repository<Tag>>(); 

Pour:

_kernel.Bind<IRepository<Tag>>.To<Repository<Tag>>();