В чем разница между этими двумя методами? - PullRequest
0 голосов
/ 17 июня 2011

Я обновился с ninject 2.0 до 2.2, и больше ничего не работает.

Когда я использую nuget, он делает это

[assembly: WebActivator.PreApplicationStartMethod(typeof(MvcApplication3.App_Start.NinjectMVC3), "Start")]
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(MvcApplication3.App_Start.NinjectMVC3), "Stop")]

namespace MvcApplication3.App_Start
{
    using System.Reflection;
    using Microsoft.Web.Infrastructure.DynamicModuleHelper;
    using Ninject;
    using Ninject.Web.Mvc;

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

        /// <summary>
        /// Starts the application
        /// </summary>
        public static void Start() 
        {
            DynamicModuleUtility.RegisterModule(typeof(OnePerRequestModule));
            DynamicModuleUtility.RegisterModule(typeof(HttpApplicationInitializationModule));
            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();
            RegisterServices(kernel);
            return kernel;
        }

        /// <summary>
        /// Load your modules or register your services here!
        /// </summary>
        /// <param name="kernel">The kernel.</param>
        private static void RegisterServices(IKernel kernel)
        {

        }        
    }
}


I use this






     /// <summary>
            /// Application_Start
            /// </summary>
            protected void Application_Start()
            {

                // Hook our DI stuff when application starts
                IKernel kernel = SetupDependencyInjection();

            }


            public IKernel SetupDependencyInjection()
            {
                IKernel kernel = CreateKernel();
                // Tell ASP.NET MVC 3 to use our Ninject DI Container
                DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel));

                return kernel;
            }

            protected IKernel CreateKernel()
            {
                var modules = new INinjectModule[]
                                  {
                                     new NhibernateModule(),
                                     new ServiceModule(),
                                     new RepoModule()
                                  };


  public class NinjectDependencyResolver : IDependencyResolver
    {
        private readonly IResolutionRoot resolutionRoot;

        public NinjectDependencyResolver(IResolutionRoot kernel)
        {
            resolutionRoot = kernel;
        }

        public object GetService(Type serviceType)
        {
            return resolutionRoot.TryGet(serviceType);
        }

        public IEnumerable<object> GetServices(Type serviceType)
        {
            return resolutionRoot.GetAll(serviceType);
        }
    }

Поэтому, когда я пытаюсь использовать свой способ (то, что работало до изменений), когда я загружаю его сейчас, я получаю какой-то контроллер без параметров.

Когда я использую их, я получаю

Error occured: Error activating SomeController
More than one matching bindings are available.
Activation path:
  1) Request for SomeController

Suggestions:
  1) Ensure that you have defined a binding for SomeController only once.

Ответы [ 3 ]

1 голос
/ 18 июня 2011

Надеюсь, вы знаете, что на https://github.com/ninject/ninject.web.mvc/wiki/Setting-up-an-MVC3-application есть документация, где объясняется этот вопрос.

1 голос
/ 17 июня 2011

Переместите массив вашего модуля в

var modules = new INinjectModule[]
                                  {
                                     new NhibernateModule(),
                                     new ServiceModule(),
                                     new RepoModule()
                                  };

в RegisterServices и добавьте

kernel.Load(modules);
0 голосов
/ 17 июня 2011

Это два разных подхода к настройке ядра.Подход, который вы использовали, требует изменения Global.asax.Пакет NuGet использует эту новую функцию ASP.NET 4, которая позволяет регистрировать динамические модули при запуске приложения.Поскольку авторы пакета NuGet не хотели связываться с Global.asax, поскольку там может быть какой-то другой существующий код, они предпочли использовать этот отдельный файл для настройки ядра.

Два подхода не являютсясовместимы, и вы никогда не должны использовать их в одном приложении.Новая версия также уже содержит NinjectDependencyResolver, поэтому вам больше не нужно писать или устанавливать какие-либо пользовательские DependencyResolver.SetResolver.

Все, что вам нужно сделать, это использовать статический метод RegisterServices в классе загрузчика для настройкиваше ядро:

private static void RegisterServices(IKernel kernel)
{
    kernel.Bind<ISomeControllerDependency>().To<SomeConcreteImpl>();
}        

И если у вас было несколько модулей NInject, которые вы хотели загрузить:

private static void RegisterServices(IKernel kernel)
{
    kernel.Load(
        new NhibernateModule(),
        new ServiceModule(),
        new RepoModule()
    );
}        

Вот и все.Не забудьте удалить любую трассировку NInject из Global.asax, чтобы избежать конфликтов.

Я думаю, причина того, что ваш код не работал с первым подходом, заключается в том, что вы не загружали модули вRegisterServices метод.

...