使用 Ninject.MVC3 在测试项目中添加绑定

Posted

技术标签:

【中文标题】使用 Ninject.MVC3 在测试项目中添加绑定【英文标题】:Adding bindings in a test project with Ninject.MVC3 【发布时间】:2012-07-17 16:37:31 【问题描述】:

我很难弄清楚这些天对于 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)

一切都很好,它可以按预期加载我的模块。但从历史上看,我所做的是这样的:

MyApp.dll

Kernel.Bind<ISomething>().To<Something>();
Kernel.Bind<IBlah>().To<Blah>();
Kernel.Bind<IFoo>().To<Foo>();

MyApp.Tests.dll

这里我只想覆盖 ISomething 的绑定,所以我过去只是取消绑定我需要模拟/任何东西并重新绑定的东西:

Kernel.Unbind<ISomething>();
Kernel.Bind<ISomethig>().To<TestSomething>();

但是Nuget 包中没有一种方法可以暗示使用原始库中的App_Start 类实现此目的的深思熟虑的方法。如果我在我的测试应用程序中放置另一个 Ninject 引导类,它似乎只是准备构建一个新内核:

[assembly: WebActivator.PreApplicationStartMethod(typeof(TestNinjectBootstrapper), "Configure")]

我可以将内核静态存储在原始引导程序中并从测试项目中调用,但这感觉不对。我是不是想太多而错过了什么?或者想得太少:)

啊。什么是好的方法?

【问题讨论】:

你找到解决办法了吗? 【参考方案1】:

要在不同的项目中重用接口/类映射注册,可以创建 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。

【讨论】:

以上是关于使用 Ninject.MVC3 在测试项目中添加绑定的主要内容,如果未能解决你的问题,请参考以下文章

Ninject 程序集与引用的程序集不匹配

使用 Ninject、MVC 3 和使用服务定位器模式的依赖注入

Ninject 在使用 NinjectHttpModule 时创建一个额外的实例

我在使用 Ninject 和 MVC 5 Web api 2.2 时遇到问题

ninject 继承安全规则违反了类型:mvc4 中的“Ninject.Web.Mvc.Filter.FilterContextParameter”

在 TreeTable 绑定上添加动态过滤器