我很难弄清楚Ninject和ASP.NET MVC 3目前最好的方法是什么。
我在我的应用程序上使用了Install-Package Ninject.MVC3
,并使用以下方法使用我的引导类:
public static void Start()
public static void Stop()
private static IKernel CreateKernel()
private static void RegisterServices(IKernel kernel)
一切都很好,它按预期加载我的模块。但从历史上看,我所做的就是这样:
Kernel.Bind<ISomething>().To<Something>();
Kernel.Bind<IBlah>().To<Blah>();
Kernel.Bind<IFoo>().To<Foo>();
在这里,我想要仅覆盖ISomething
的绑定,所以我过去只需解开我需要的东西来模拟/解决并重新绑定:
Kernel.Unbind<ISomething>();
Kernel.Bind<ISomethig>().To<TestSomething>();
但Nuget
包中没有一种方法可以通过原始库中的App_Start
类来实现这一目的。如果我在我的测试应用程序中放入另一个Ninject引导类,那么它似乎只是为了构建一个新内核:
[assembly: WebActivator.PreApplicationStartMethod(typeof(TestNinjectBootstrapper), "Configure")]
我可以静态地将内核存储在原始引导程序中并从测试项目中调用,但这感觉不对。我是在想太多而想念一些东西?或者思考太少:)
哎呀。什么是好方法?
答案 0 :(得分:0)
要在不同项目中重用接口/类映射注册,可以创建NInject模块。模块只需要实现INinjectModule接口,但为了简单起见,大多数应该扩展NinjectModule类。
因此,您可以将接口/类映射放在模块中,如下例所示:
public class WarriorModule : NinjectModule
{
public override void Load()
{
Bind<IWeapon>().To<Sword>();
Bind<Samurai>().ToSelf().InSingletonScope();
}
}
定义此类模块后,您可以使用此模块中定义的映射来实例化内核。 您需要的只是在创建内核对象期间将此模块指定为参数:
IKernel kernel = new StandardKernel(new WarriorModule());
请注意,您可以使用多个模块创建和实例化内核。
因此,模块将帮助您重用默认映射配置。映射配置将在一个地方定义,这将简化维护,特别是如果有多个项目使用相同的接口/类映射配置。
还有一些其他功能,如“动态模块加载”等。有关模块的更多信息可以在here找到。