В чем разница между использованием этих двух методов?

Я обновился с 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.

person chobo2    schedule 16.06.2011    source источник


Ответы (3)


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

person Remo Gloor    schedule 17.06.2011

Переместите массив модулей в

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

в RegisterServices и добавьте

kernel.Load(modules);
person Eric Smith    schedule 16.06.2011
comment
Я попробую это снова. Я сделал что-то подобное, но я пытаюсь понять, в чем разница между тем, что у меня было раньше, и тем, что создается с помощью плагина ninject mvc 3. - person chobo2; 17.06.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.

person Darin Dimitrov    schedule 17.06.2011
comment
@Дарин Димитров - На самом деле я загрузил модули. Я сделал это немного по-другому. Я просто не показывал его там, так как вернул код обратно. Я могу перейти к тому, что предоставляется. Однако я просто пытаюсь понять, почему то, что у меня было, вдруг не работает. Я также пытался понять, почему, когда я перешел на новую душу, она все еще не работала. Из того, что я нашел stackoverflow.com/questions/2423862/ доступно более одной совпадающей привязки, заключается в том, что вам нужно привязать контроллеры к себе. Мне никогда не приходилось делать это раньше. - person chobo2; 17.06.2011
comment
Так что мне кажется, что я как бы иду назад. Вышла новая версия и теперь мне приходится привязывать контроллеры к себе (если это решит мою проблему, я еще не пробовал), когда мне никогда не приходилось этого делать раньше. - person chobo2; 17.06.2011
comment
@chobo2, привязываете контроллеры друг к другу? Не могли бы вы объяснить, что это значит? Я не уверен, что понимаю тебя. Пока у вас есть контроллер, который принимает некоторый интерфейс в качестве параметра конструктора, и этот интерфейс зарегистрирован в ядре с правильной реализацией, вам не нужно привязывать какие-либо контроллеры к чему-либо. - person Darin Dimitrov; 17.06.2011
comment
@Дарин Димитров - прочитайте принятый ответ по ссылке, которую я разместил. Я получаю ту же ошибку, что и он. Когда я прошел через отладчик, у меня было что-то, что нужно было связать, и он связал это правильно. Затем я попытался загрузить контроллер, и он внезапно сказал, что не может найти конструктор без параметров. Конечно до обновления все заработало. - person chobo2; 17.06.2011
comment
@chobo2, можешь прислать мне пример проекта, иллюстрирующий проблему? Я думаю, что мне было бы проще всего понять ваш сценарий, что вы пытаетесь сделать и что не работает. - person Darin Dimitrov; 17.06.2011
comment
@Дарин Димитров - Кажется, у меня по какой-то причине был дубликат в моем репо. Почему это работало со старой версией ninject, а не с новой, я не уверен. Так что я буду тестировать его и вернуться к вам в ближайшее время. - person chobo2; 17.06.2011
comment
@ chobo2 Ninject 2.0 брал одну привязку, если совпадало несколько. Но поскольку не было определено, какая из них из-за нестабильного алгоритма сортировки, теперь считается недопустимой конфигурацией. Поэтому, если ожидается, что он должен быть уникальным сейчас. - person Remo Gloor; 18.06.2011