代码之家  ›  专栏  ›  技术社区  ›  StriplingWarrior

Ninject 2中的上下文变量

  •  4
  • StriplingWarrior  · 技术社区  · 14 年前

    this article 关于Ninject早期版本中的上下文变量。我的问题有两个方面。首先,我怎样才能在Ninject 2中得到这种行为?其次,上下文变量是否在请求链中传递?例如,假设我想替换这些电话:

    var a = new A(new B(new C())));
    var specialA = new A(new B(new SpecialC()));
    

    ... 有了这个:

    var a = kernel.Get<A>();
    var specialA = kernel.Get<A>(With.Parameters.ContextVariable("special", "true"));
    

    是否可以设置这样的绑定,当上下文在构造 C ?

    1 回复  |  直到 14 年前
        1
  •  3
  •   Ruben Bartelink    14 年前

    这里有一些我用来对付V2的东西,用~0的努力来帮你清理它-如果你不能去除它,请告诉我。

    正如您所猜测的,似乎没有一个真正明确的API来呈现v2中的“context参数,即使对于嵌套的分辨率”内容(它的存在作为第三个参数隐藏在 Parameter

    public static class ContextParameter
    {
        public static Parameter Create<T>( T value )
        {
            return new Parameter( value.GetType().FullName, value, true );
        }
    }
    
    public static class ContextParameterFacts
    {
        public class ProductId
        {
            public ProductId( string productId2 )
            {
                Value = productId2;
    
            }
            public string Value { get; set; }
        }
    
        public class Repository
        {
            public Repository( ProductId productId )
            {
                ProductId = productId;
    
            }
            public ProductId ProductId { get; set; }
        }
    
        public class Outer
        {
            public Outer( Repository repository )
            {
                Repository = repository;
            }
            public Repository Repository { get; set; }
        }
    
        public class Module : NinjectModule
        {
            public override void Load()
            {
                Bind<ProductId>().ToContextParameter();
            }
        }
    
        //[ Fact ]
        public static void TwoDeepShouldResolve()
        {
            var k = new StandardKernel( new Module() );
            var o = k.Get<Outer>( ContextParameter.Create( new ProductId( "a" ) ) );
            Debug.Assert( "a" == o.Repository.ProductId.Value );
        }
    }
    

    下面是一些代码(这会混淆问题),演示如何在上下文中应用它:-

    public class ServicesNinjectModule : NinjectModule
    {
        public override void Load()
        {
            Bind<ProductId>().ToContextParameter();
    
            Bind<Func<ProductId, ResourceAllocator>>().ToConstant( ( productId ) => Kernel.Get<ResourceAllocator>(
                ContextParameter.Create( productId ) ) );
        }
    }
    
    public static class NinjectContextParameterExtensions
    {
        public static IBindingWhenInNamedWithOrOnSyntax<T> ToContextParameter<T>( this IBindingToSyntax<T> bindingToSyntax )
        {
            return bindingToSyntax.ToMethod( context => (T)context.Parameters.Single( parameter => parameter.Name == typeof( T ).FullName ).GetValue( context ) );
        }
    }
    

    像往常一样,你应该去查资料来源和测试——他们会给你提供比我更详细、更相关的答案。

    推荐文章