我正在尝试使用Bootstrapper with Ninject 。我已经安装了 Ninject.MVC3
来从 nuget 初始化我的 Ninject 容器,并且创建了一个如下所示的测试模块:
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>();
}
}
我还在我的 Global.asax.cs
中包含了 Start()
调用
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();
}
}
但是,当调用具有依赖项的 Controller 时,我仍然从 Ninject 收到 ActivationException
,表明未调用我的 TestNinjectModule.Load()
方法。我该如何解决这个问题?
异常消息:
Error activating IUnitOfWork No matching bindings are available, and the type is not self-bindable. Activation path: 2) Injection of dependency IUnitOfWork into parameter unitOfWork of constructor of type > TreasurySystemController 1) Request for SystemController
Suggestions: 1) Ensure that you have defined a binding for IUnitOfWork. 2) If the binding was defined in a module, ensure that the module has been loaded into > the kernel. 3) Ensure you have not accidentally created more than one kernel. 4) If you are using constructor arguments, ensure that the parameter name matches the >constructors parameter name. 5) If you are using automatic module loading, ensure the search path and filters are >correct.
堆栈跟踪:
at Ninject.KernelBase.Resolve(IRequest request) in c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs:line 359 at 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 parent) in c:\Projects\Ninject\ninject\src\Ninject\Planning\Targets\Target.cs:line 165 at Ninject.Activation.Providers.StandardProvider.GetValue(IContext context, ITarget target) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:line 114 at Ninject.Activation.Providers.StandardProvider.<>c_DisplayClass4.b_2(ITarget target) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:line 96 at System.Linq.Enumerable.WhereSelectArrayIterator2.MoveNext() at System.Linq.Buffer
1..ctor(IEnumerable1 source) at System.Linq.Enumerable.ToArray[TSource](IEnumerable
1 source) at Ninject.Activation.Providers.StandardProvider.Create(IContext context) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:line 96 at Ninject.Activation.Context.Resolve() in c:\Projects\Ninject\ninject\src\Ninject\Activation\Context.cs:line 157 at Ninject.KernelBase.<>c_DisplayClass10.b_c(IBinding binding) in c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs:line 386 at System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext() at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable
1 source) at Ninject.Web.Mvc.NinjectDependencyResolver.GetService(Type serviceType) in c:\Projects\Ninject\ninject.web.mvc\mvc3\src\Ninject.Web.Mvc\NinjectDependencyResolver.cs:line 56 at System.Web.Mvc.DefaultControllerFactory.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType)
最佳答案
我已经找到解决办法了。通过将 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()
方法。
关于c# - Bootstrapper 未加载我的 NinjectModules,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16559752/