使用这两种方法有什么区别?

时间:2011-06-16 21:45:24

标签: asp.net-mvc asp.net-mvc-3 ninject ninject-2

我从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 个答案:

答案 0 :(得分:1)

将模块阵列移动到

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

进入RegisterServices并添加

kernel.Load(modules);

答案 1 :(得分:1)

我希望您知道https://github.com/ninject/ninject.web.mvc/wiki/Setting-up-an-MVC3-application处有一个文档,其中解释了这个问题。

答案 2 :(得分:0)

这是配置内核的两种不同方法。您使用的方法需要修改Global.asax。 NuGet包使用ASP.NET 4的这一新功能,允许在应用程序启动时注册动态模块。因为NuGet包的作者不想弄乱Global.asax因为可能存在其他现有代码,所以他们更喜欢使用这个单独的文件来配置内核。

这两种方法不兼容,您不应在同一应用程序中同时使用它们。新版本还包含NinjectDependencyResolver,因此您无需再编写或设置任何自定义DependencyResolver.SetResolver

您需要做的就是使用bootstrapper类中的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()
    );
}        

就是这样。不要忘记从Global.asax中删除任何NInject跟踪以避免任何冲突。

我猜你的代码无法使用第一种方法的原因是因为你没有在RegisterServices方法中加载模块。