我从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.
答案 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
方法中加载模块。