2

Я пытаюсь использовать Bootstrapper with Ninject. Я установил Ninject.MVC3 инициализировать мой Ninject контейнер из NuGet и я создал тестовый модуль, как это:Bootstrapper не загружает мои NinjectModules

public class TestNinjectModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<DBEntities>().ToSelf().InRequestScope(); 
     Bind(typeof(IGenericRepository<>)) 
       .To(typeof(GenericRepository<>)).InRequestScope(); 
     Bind<ISystemRepository>().To<SystemRepository>().InRequestScope(); 
     Bind<IUnitOfWork>().To<UnitOfWork>(); 
    } 
} 

Я также включил Start() вызов в моей Global.asax.cs

public class MvcApplication : System.Web.HttpApplication 
{ 
    protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     WebApiConfig.Register(GlobalConfiguration.Configuration); 
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     BundleConfig.RegisterBundles(BundleTable.Bundles); 

     Bootstrapper.With.Ninject().Start(); 
     Bootstrapper.With.AutoMapper().Start(); 
    } 
} 

Однако я все еще получаю ActivationException из Ninject, когда вызывается контроллер с зависимостью, сигнализация моего метода TestNinjectModule.Load() не вызывалась. Как я могу это решить?

Сообщение исключения:

Ошибка активация IUnitOfWork Нет соответствующие привязки не доступны, и тип не является самим-Привязываемым. Путь Активация: 2) Инъекция зависимостей IUnitOfWork в параметр UnitOfWork конструктора типа> TreasurySystemController 1) Запрос SystemController

Предложения: 1) Убедитесь, что вы определили привязку для IUnitOfWork. 2) Если привязка была определена в модуле, убедитесь, что модуль загружен в> ядро. 3) Убедитесь, что вы случайно не создали несколько ядер. 4) Если вы используете аргументы конструктора, убедитесь, что имя параметра соответствует имени параметра> constructors. 5) Если вы используете автоматическую загрузку модуля, убедитесь, что путь поиска и фильтры> правильные.

Трассировка стека:

в Ninject.KernelBase.Resolve (запрос IRequest) в C: \ Проекты \ Ninject \ Ninject \ SRC \ Ninject \ KernelBase.cs: строка 359 в Ninject.Planning .Targets.Target 1.GetValue(Type service, IContext parent) in c:\Projects\Ninject\ninject\src\Ninject\Planning\Targets\Target.cs:line 197 at Ninject.Planning.Targets.Target 1.ResolveWithin (родитель IContext) в c: \ Projects \ Ninject \ ninject \ src \ Ninject \ Planning \ Targets \ Target.cs: строка 165 в Ninject.Activation.Providers.StandardProvider.GetValue (контекст IContext , Цель ITarget) в c: \ Projects \ Ninject \ ninject \ src \ Ninject \ Activation \ Providers \ StandardProvider.cs: строка 114 на странице Ninject.Activation.Providers.StandardProvide р. <> c_ DisplayClass4.b _2 (мишень ITarget) в C: \ Проекты \ Ninject \ Ninject \ SRC \ Ninject \ \ активации Провайдеры \ StandardProvider.cs: строка 96 в System.Linq.Enumerable.WhereSelectArrayIterator 2.MoveNext() at System.Linq.Buffer 1 .. ctor (IEnumerable 1 source) at System.Linq.Enumerable.ToArray[TSource](IEnumerable 1 источник) at Ninject.Activation.Providers.StandardProvider.Create (контекст IContext) в c: \ Projects \ Ninject \ ninject \ src \ Ninject \ Activation \ Providers \ StandardProvider.cs: строка 96 в Ninject. Activation.Context.Resolve() в c: \ Projects \ Ninject \ ninject \ src \ Ninject \ Activation \ Context.cs: строка 157 в Ninject.KernelBase. <> c_ DisplayClass10.b _c (связывание IBinding) в C: \ Проекты \ Ninject \ Ninject \ SRC \ Ninject \ KernelBase.cs: Строка 386 на System.Linq.Enumerable.WhereSelectEnumerableIterator 2.MoveNext() at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable 1 источник) на Ninject. Web.Mvc.NinjectDependencyResolver.GetService (тип serviceType) в c: \ Projects \ Ninject \ ninject.web.mvc \ mvc3 \ src \ Ninject.Web.Mvc \ NinjectDependencyResolver.cs: строка 56 в System.Web.Mvc.DefaultControllerFactory .DefaultControllerActivator.Создать (RequestContext requestContext, Type controllerType)

+0

«ActivationException'» ... когда контроллер с зависимостью называется «... какое исключение? что называется? Я думаю, вы, возможно, перескакиваете на преждевременные выводы. Что произойдет, если вы установите точку останова на 'Load'? Что вы видите, когда исследуете Ядро в момент, когда Активация терпит неудачу? –

+0

@RubenBartelink 'ActivationException' - это исключение, вызванное Ninject, когда оно не может разрешить зависимость. Когда я помещал контрольные точки в свои «Application_Start()» и «CreateKernel()» (в классе «NinjectWebCommon», созданный путем установки пакета Nuget Ninject.MVC3'), существует ** два ** ядра, которые создаются, и только один без моих привязок был активирован для разрешения зависимостей. Вот почему я получаю исключение – rexcfnghk

+0

TL; DR - вы не ответили на мои вопросы, поэтому никто еще не ответил на ваш вопрос. Я знаю, что такое ActivationException и многие другие делают; я считаю, что полный StackTrace (это не должно быть 20 страниц), и Message добавляет много. 2 ядра предназначены для 2 HttpApplications. Вы попали в вашу нагрузку()? Является ли неудачное решение [у нас нет stacktrace для] (когда вы сообщаете отладчику обрыв первого шанса), происходящее с ядром с или без привязок. –

ответ

2

Я нашел решение. Изменяя реализации NinjectWebCommon на:

public static class NinjectWebCommon 
{ 
    private static readonly Bootstrapper bootstrapper = new Bootstrapper(); 
    public static IKernel Kernel { get; private set; } // Expose the kernel through a property 

    /// <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(); 
     kernel.Bind<Func<IKernel>>().ToMethod(ctx =>() => new Bootstrapper().Kernel); 
     kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); 

     return Kernel = kernel; 
    } 
} 

Тогда в Global.asax.cs:

public class MvcApplication : System.Web.HttpApplication 
{ 
    protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     WebApiConfig.Register(GlobalConfiguration.Configuration); 
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     BundleConfig.RegisterBundles(BundleTable.Bundles); 

     Bootstrapper.With.AutoMapper().Start(); 
     Bootstrapper.With.Ninject() 
      .WithContainer(NinjectWebCommon.Kernel) // Use the kernel inside NinjectWebCommon instead of creating a new one 
      .Start(); 
    } 
} 

Тогда все классы, вытекающие из NinjectModule будут иметь свои Load() методы называются.