使用 Ninject 2.2 更改默认对象范围

2024-04-15

是否可以更改 Ninject 2.2 中的默认对象范围?如果是这样,是如何完成的?


据我所知你可以覆盖AddBinding() on the BindingRoot (StandardKernel or NinjectModule)并修改ScopeCallback绑定对象上的属性。

public class CustomScopeKernel : StandardKernel
{
    public CustomScopeKernel(params INinjectModule[] modules) 
        : base(modules)
    {
    }

    public CustomScopeKernel(
        INinjectSettings settings, params INinjectModule[] modules)
        : base(settings, modules)
    {
    }

    public override void AddBinding(IBinding binding)
    {
        // Set whatever scope you would like to have as the default.
        binding.ScopeCallback = StandardScopeCallbacks.Singleton;
        base.AddBinding(binding);
    }
}

该测试现在应该通过(使用 xUnit.net)

public class DefaultScopedService { }

[Fact]
public void Should_be_able_to_change_default_scope_by_overriding_add_binding()
{
    var kernel = new CustomScopeKernel();
    kernel.Bind<DefaultScopedService>().ToSelf();

    var binding = kernel.GetBindings(typeof(DefaultScopedService)).First();
    binding.ScopeCallback.ShouldBe(StandardScopeCallbacks.Singleton);
}

The CustomScopeKernel也可与 Ninject 模块配合使用。

public class ServiceModule : NinjectModule
{
    public override void Load()
    {
        Bind<DefaultScopedService>().ToSelf();
    }
}

[Fact]
public void Should_be_able_to_change_default_scope_for_modules()
{
    var module = new ServiceModule();
    var kernel = new CustomScopeKernel(module);

    var binding = kernel.GetBindings(typeof(DefaultScopedService)).First();
    binding.ScopeCallback.ShouldBe(StandardScopeCallbacks.Singleton);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Ninject 2.2 更改默认对象范围 的相关文章

随机推荐