Ninject extensions 使用工厂方法参数成功绑定Ninject自定义实例提供程序以解析

Ninject extensions 使用工厂方法参数成功绑定Ninject自定义实例提供程序以解析,ninject-extensions,abstract-factory,open-generics,ninject-conventions,Ninject Extensions,Abstract Factory,Open Generics,Ninject Conventions,我一直在研究一个类似的问题,在这个问题中,我认为具体工厂返回一个基于工厂方法上的字符串参数的实现,该字符串参数与具体实现上的命名绑定相匹配 当工厂是一个抽象工厂时,我正在努力使一个稍微复杂一些的示例正常工作,我希望使用基于Ninject约定的绑定。考虑下面的测试: [事实] public void VehicleBuilderFactory为指定的客户端()创建正确的生成器 { //安排 StandardKernel内核=新的StandardKernel(); Bind(typeof(IVehi

我一直在研究一个类似的问题,在这个问题中,我认为具体工厂返回一个基于工厂方法上的字符串参数的实现,该字符串参数与具体实现上的命名绑定相匹配

当工厂是一个抽象工厂时,我正在努力使一个稍微复杂一些的示例正常工作,我希望使用基于Ninject约定的绑定。考虑下面的测试:

[事实]
public void VehicleBuilderFactory为指定的客户端()创建正确的生成器
{
//安排
StandardKernel内核=新的StandardKernel();
Bind(typeof(IVehicleBuilderFactory))
.ToFactory(()=>新UseFirstArgumentAsNameInstanceProvider())
.InSingletonScope();
Bind(scanner=>scanner
.FromThisAssembly()中的
.SelectAllClasses()
.WhichAreNotGeneric()
.继承自(typeof(IVehicleBuilder))
.BindAllInterfaces());
var bicycleBuilderFactory=
Get();
字符串country=“德国”;
字符串localizedColor=“blau”;
//表演
var builder=bicycleBuilderFactory.Create(国家);
自行车=builder.Build(本地化颜色);
//断言
Assert.IsType(生成器);
Assert.IsType(Bicycle);
Assert.Equal(本地化颜色、Bicycle.Color);
}
在这里,我试着用手电筒和刀子玩杂耍,因为我曾经在互联网上看到过:

公共类UseFirstArgumentAsNameInstanceProvider:StandardInstanceProvider
{
受保护的重写字符串GetName(MethodInfo MethodInfo,对象[]参数){
返回methodInfo.GetGenericArguments()[0]。名称+“生成器”+(字符串)参数[0];
//例如:德国->“蓝色自行车”+“建筑商”+“德国”=“蓝色自行车建筑商”\u德国”
}
受保护的重写构造函数参数[]GetConstructorArguments(MethodInfo MethodInfo,object[]参数){
返回base.GetConstructorArguments(methodInfo,arguments).Skip(1).ToArray();
}
}
当我试图分配带有以下错误的
bicycleBuilderFactory
时,我被刺伤并点燃:

用户代码未处理System.InvalidCastException Message=无法将类型为“Castle.Proxy.ObjectProxy”的对象强制转换为类型为“Ninject.Extensions.Conventions.Tests.IVehicleBuilderFactory`2[Ninject.Extensions.Conventions.Tests.IVehicleBuilder`1[Ninject.Extensions.Conventions.Tests.BlueBicycle],Ninject.Extensions.Conventions.Tests.BlueBicycle]”。 Source=System.Core 堆栈跟踪: 在System.Linq.Enumerable.d_uB1`1.MoveNext()中 at System.Linq.Enumerable.Single[TSource](IEnumerable`1 source) 在c:\Projects\Ninject\Ninject\src\Ninject\Syntax\ResolutionExtensions.cs中的Ninject.ResolutionExtensions.Get[T](IResolutionRoot,iPParameter[]参数)处:第37行 在Ninject.Extensions.Conventions.Tests.NinjectFactoryConventionsTests.VehicleBuilderFactory中,您为C:\Programming\Ninject.Extensions.Conventions.Tests\NinjectFactoryConventionsTests.cs中指定的客户端()创建正确的构建器:第40行 内部异常: 是否可以使用
ToFactory()
方法和自定义提供程序,使用工厂方法参数(
“Germany”
以及泛型类型参数(
IVehicleBiulder,BlueBicycle
)绑定以解析类型?

下面是测试的其余代码,尽可能紧凑和可读

公共接口IVehicleBuilderFactory
where T:IVehicleBuilder where TVehicle:IVehicle
{
T创建(字符串国家);
}
车辆生成器实施

公共接口IVehicleBuilder,其中T:IVehicle{T Build(string localizedColor);}
抽象类BicycleBuilder:IVehiclbuilder其中T:Bicycle
{
公共摘要T构建(字符串本地化颜色);
}
公共抽象类RedBicycleBuilder:IVehicleBuilder
{
私人只读红色自行车;
公共红色自行车制造商(红色自行车){u Bicycle=Bicycle;}
公共红色自行车构建(字符串本地化颜色)
{
_Bicycle.Color=本地化颜色;
回程自行车;
}
}
公共抽象类GreenBicycleBuilder:IVehicleBuilder
{
私人只读绿色自行车;
公共绿色自行车制造商(绿色自行车)
公共绿色自行车构建(字符串本地化颜色)
{
_Bicycle.Color=本地化颜色;
回程自行车;
}
}
公共抽象类BluebicyBuilder:IVehicleBuilder
{
私人只读蓝自行车;
公共自行车制造商(自行车){u Bicycle=Bicycle;}
公共BlueBicycle生成(字符串本地化颜色)
{
_Bicycle.Color=本地化颜色;
回程自行车;
}
}
公共级RedBicycleBuilder\u美国:RedBicycleBuilder{
美国公共红色自行车制造商(红色自行车):基地(自行车){}
}
公共级RedBicycleBuilder\u德国:RedBicycleBuilder{
德国公共红色自行车制造商(红色自行车):基地(自行车){}
}
公共级RedBicycleBuilder\u法国:RedBicycleBuilder{
法国公共红色自行车制造商(红色自行车):基地(自行车){}
}
公共类RedBicycleBuilder\u默认值:RedBicycleBuilder{
公共RedBicycleBuilder_默认值(RedBicycle):基本(Bicycle){}
}
公共级绿色自行车制造商\美国:绿色自行车制造商{
美国公共绿色自行车制造商(绿色自行车):基地(自行车){}
}
公共级绿色自行车制造商\德国:绿色自行车制造商{
德国公共绿色自行车制造商(绿色自行车):基地(自行车){}
}
法国公共级绿色自行车制造商:绿色自行车制造商{
法国公共绿色自行车制造商(绿色自行车):基地(自行车){}
}
公共级绿色自行车制造商_