1

我正在尝试使用 Ninject 作为 IoC 容器来测试我的 Nancy 模块。我的问题是我似乎无法让 Nancy 使用我的 IoC 绑定来解析 NancyModule 类型。

我在 Nuget 上使用最新的 Nancy,最新的 Nancy.Bootstrap.Ninject 使用最新的 Ninject 从源代码构建。

我的测试设置如下:

[TestFixtureSetUp]
    public virtual void ClassSetup()
    {
        Assembly.Load(typeof (MyModule).Assembly.FullName);
        var bootstrapper = new AspHostConfigurationSource();
        this.host = new Browser(bootstrapper);
    }

[Test]
public void test()
{
/*snip */
    var id = entity.Id;

    var response = host.Put("/path/to/{0}/".With(id.Encode()),
            (with) =>
            {
                with.HttpRequest();
                with.Header("Accept", "application/xml");
            });

        response.StatusCode.Should().Be(Nancy.HttpStatusCode.OK);

            /*snip */
    }

这是我的测试设置,剪断了。现在是我的主机设置(在我的程序集中定义):

public class MyBootstrapper: Nancy.Bootstrappers.Ninject.NinjectNancyBootstrapper
{
    public bool ApplicationContainerConfigured { get; set; }

    public Ninject.IKernel Container
    {
        get { return ApplicationContainer; }
    }

    public bool RequestContainerConfigured { get; set; }

    protected override void ConfigureApplicationContainer(Ninject.IKernel existingContainer)
    {
        this.ApplicationContainerConfigured = true;
        base.ConfigureApplicationContainer(existingContainer);

        Nancy.Json.JsonSettings.MaxJsonLength = Int32.MaxValue;
        StaticConfiguration.DisableCaches = true;
    }

    protected override void ConfigureRequestContainer(Ninject.IKernel container, NancyContext context)
    {
        container.Load(new[] { new ServiceModule() });
    }

    protected override DiagnosticsConfiguration DiagnosticsConfiguration
    {
        get { return new DiagnosticsConfiguration { Password = @"12345" }; }
    }
}

我的 IoC 绑定如下:

Bind<Nancy.NancyModule>()
        .ToMethod(context =>
        {
            return new MyModule1(context.Kernel.Get<IMongoRepository<Guid, Entity>>(
                Properties.Settings.Default.NamedCollection1),
                                                  context.Kernel.Get<IMongoRepository<Guid, Entity>>(
                                                    Properties.Settings.Default.NamedCollection2));
        })
        .Named(typeof(MyModule1).FullName);

Bind<Nancy.NancyModule>()
        .ToMethod(context =>
        {
            return new MyModule2(context.Kernel.Get<IMongoRepository<Guid, Entity>>(
                Properties.Settings.Default.NamedCollection3),
                                                  context.Kernel.Get<IMongoRepository<Guid, Entity>>(
                                                    Properties.Settings.Default.NamedCollection4));
        })
        .Named(typeof(MyModule2).FullName);

我想控制 Nancy 模块的构建。我查看了 Nancy 的源代码,看起来对于请求,nancy 向配置的 IoC 容器询问具有适当键的 NancyModule 类型的所有已注册绑定。下面的代码在 Nancy.Bootstrappers.Ninject 程序集中定义

   protected override sealed NancyModule GetModuleByKey(IKernel container, string moduleKey)
    {
        return container.Get<NancyModule>(moduleKey);
    }

密钥看起来是使用密钥生成器对象生成的:

public class DefaultModuleKeyGenerator : IModuleKeyGenerator
{
    /// <summary>
    /// Returns a string key for the given type
    /// </summary>
    /// <param name="moduleType">NancyModule type</param>
    /// <returns>String key</returns>
    public string GetKeyForModuleType(Type moduleType)
    {
        return moduleType.FullName;
    }
}

这就是我的绑定设置为命名绑定的原因。这个想法是,当 Nancy 请求一个命名绑定(对于一个模块)时,它会选择我的命名绑定。

它没有按预期工作。Ninject 抱怨我为 NancyModule 类型设置了多个绑定。

重申一下:我的目标是控制 Nancy 模块的构建。

任何想法将不胜感激。

PS当我谈论将依赖项注入模块时,我会/不/像这个问题一样参考NinjectModules

4

0 回答 0