我在早期版本的Ninject中找到了关于Context Variables的this article。我的问题是双重的。首先,如何使用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
时,上下文会记住它处于“特殊”上下文中?
答案 0 :(得分:3)
这是我用来对抗V2的一些东西,只需要努力为你清理它 - 如果你不能解开它,请告诉我。
正如你所推测的那样,似乎没有一个真正明确的API能够在v2中显示“上下文参数,即使对于嵌套分辨率”的东西(它的存在被隐藏为第三个参数,在过载时Parameter
ctor)。
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 ) );
}
}
像往常一样,你应该去寻找源头和测试 - 他们会为你提供比我更详细和相关的答案。