2015-07-30 1 views
0

Я использую NinjectWebCommon для выполнения инъекций в моих контроллерах. Я установил пакет через Nuget, и он создал NinjectWebCommon.cs в моем App_Start, как он говорит в собственной документации. Мне нужно знать, почему он не работает так, как должен, потому что я следую за документацией шаг за шагом. Следит некоторые фрагменты:Ninject не загружает зависимости, используя Asp.NET MVC 4 C#

NinjectWebCommon.cs:

public static class NinjectWebCommon 
    { 
     private static readonly Bootstrapper bootstrapper = new Bootstrapper(); 

     /// <summary> 
     /// Starts the application 
     /// </summary> 
     public static void Start() 
     { 
      DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule)); 
      DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule)); 
      bootstrapper.Initialize(CreateKernel); 
     } 

     /// <summary> 
     /// Stops the application. 
     /// </summary> 
     public static void Stop() 
     { 
      bootstrapper.ShutDown(); 
     } 

     /// <summary> 
     /// Creates the kernel that will manage your application. 
     /// </summary> 
     /// <returns>The created kernel.</returns> 
     private static IKernel CreateKernel() 
     { 
      var kernel = new StandardKernel(); 

      try 
      { 
       kernel.Bind<Func<IKernel>>().ToMethod(ctx =>() => new Bootstrapper().Kernel); 
       kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); 

       RegisterServices(kernel); 
       return kernel; 
      } 
      catch 
      { 
       kernel.Dispose(); 
       throw; 
      } 
     } 

     /// <summary> 
     /// Load your modules or register your services here! 
     /// </summary> 
     /// <param name="kernel">The kernel.</param> 
     private static void RegisterServices(IKernel kernel) 
     { 
      //kernel.Load(AppDomain.CurrentDomain.GetAssemblies()); 
      kernel.Bind<IFooService>().To<FooService>(); 
     } 
    } 

Контроллер:

public class FooController : Controller 
    { 
     private readonly IFooService fooService; 

     public FooController(IFooService fooService) 
     { 
      this.fooService = fooService; 
     } 

     public ActionResult Index() 
     { 
      return View(this.fooService.All()); 
     } 
    } 

Это создает эту ошибку:

Error activating IFooService No matching bindings are available, and the type is not self-bindable. Activation path:
2) Injection of dependency IFooService into parameter fooService of constructor of type FooController
1) Request for FooController

Suggestions:
1) Ensure that you have defined a binding for IFooService.
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 constructor arguments, ensure that the parameter name matches the constructors parameter name.
5) If you are using automatic module loading, ensure the search path and filters are correct.

Использование IoC для устранения случаев, но он работает onl y в моем HomeController, если я перехожу на другой контроллер, используя ТОЧНО тот же код (с IoC), он снова генерирует ошибку. Выполняет код с помощью IoC.

с помощью IoC:

private readonly IFooService fooService; 

     public HomeController() 
     { 
      this.fooService = IoC.Instance.Resolve<IFooService>(); 
     } 

     public ActionResult Index() 
     { 

      ViewBag.MyFoos = this.fooService.All(); 

      return View(); 
     } 

формирует эту ошибку:

No matching bindings are available, and the type is not self-bindable.

Error activating IFooService No matching bindings are available, and the type is not self-bindable.

Activation path:
1) Request for IFooService

Suggestions:

1) Ensure that you have defined a binding for IFooService.
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 constructor arguments, ensure that the parameter name matches the constructors parameter name. 5) If you are using automatic module loading, ensure the search path and filters are correct.

ответ

0

Вы уверены, что у вас есть обязательными для ISetorService? Я не вижу этого в коде, который вы опубликовали.

+0

К сожалению, это является обязательным: частного статической силы RegisterServices (Ikernel ядро) { //kernel.Load(AppDomain .CurrentDomain.GetAssemblies()); kernel.Bind () .T (); } –

+0

Это обязательное условие для 'IFooService', но ошибка ищет' ISetorService' –

+0

Нет, я просто забыл изменить ошибки для «foo» ... = / –

0

Я решил проблему, загрузив все «NinjectModule» моей иерархии приложений.

Я думал, что достаточно загрузить только основной модуль, а затем создать другой метод statico в «NinjectWebCommon» только для разделения обязанностей и организации кода. Ниже приведен код, используемый:

var kernel = new StandardKernel(new Repository(), new Service(), new ValidationAndBusinessRules()); 

, которые несут все свои Хранилища услуги и валидатор в создании ядра.

private static void RegisterObrigatoryServices(IKernel kernel) 
     { 
      kernel.Bind<IIdentityProvider>().To<ServiceIdentityProvider>(); 
      kernel.Bind<Guid>().ToMethod(ctx => default(Guid)).Named("CurrentProcessId"); 
      kernel.Bind<ISession>().ToMethod(ctx => 
      { 
       SessionPoolManager.Update(); 

       Guid processId = kernel.Get<Guid>("CurrentProcessId", new Parameter[] { }); 

       if (processId == default(Guid)) 
       { 
        return SessionFactoryBuilder.SessionFactory(kernel.Get<IIdentityProvider>()).OpenSession(); 
       } 
       else 
       { 
        ISession session = SessionPoolManager.Get(processId); 
        if (session == null) 
        { 
         session = SessionFactoryBuilder.SessionFactory(kernel.Get<IIdentityProvider>()).OpenSession(); 
         SessionPoolManager.Register(processId, session); 
        } 

        return session; 
       } 
      }); 
     } 

метод, созданный мной в рамках NinjectWebCommon, как упоминалось выше, только для записи необходимых зависимостей.

Весь этот код в основном является родным и был вставлен в пакет Nuget Ninject.MVC4 (установленный с помощью диспетчера диспетчера пакетов в Visual Studio). Этот пакет вставляет класс в каталог App_Start под названием «NinjectWebCommon», и я сделал эти изменения.

Контроллер устанавливается для отправки документации пакета, следующим образом:

public class HomeController : Controller 
     { 
      private readonly IFooService fooService; 

      public HomeController(IFooService fooService) 
      { 
       this.fooService = fooService; //Daqui para frente é possível usar normalmente o service. 
      } 
     }