Ninject工厂方法参数依赖注入报错,如何按参数注入正确对象?
问题分析与解决方案
核心问题
- 接口类型不匹配:工厂接口
IVehicleType的GetVehicleType方法返回IVehicleMethods,但实际绑定的是IVehicleInfo的实现类,类型不一致会导致逻辑混乱。 - 绑定未关联参数筛选:原绑定仅用
NamedLikeFactoryMethod标记,但未让Ninject根据传入的VehicleCategory参数区分不同实现,导致调用时Ninject找到多个IVehicleInfo绑定,无法确定实例。
修正步骤
1. 修正工厂接口返回类型
将工厂方法的返回类型改为IVehicleInfo,与实际注入的接口保持一致:
public enum VehicleCategory { Bus, Car, Truck } public interface IVehicleType { // 修正返回类型为IVehicleInfo IVehicleInfo GetVehicleType(VehicleCategory vehicleCategory, bool newVehicle); }
2. 基于参数条件实现精准绑定
放弃NamedLikeFactoryMethod,改用When条件绑定,让Ninject根据工厂方法传入的VehicleCategory参数匹配对应的实现类:
public class VehicleModule : NinjectModule { public override void Load() { // 绑定工厂接口到Ninject Factory自动实现 Bind<IVehicleType>().ToFactory(); // 根据VehicleCategory参数匹配TruckVehicle Bind<IVehicleInfo>().To<TruckVehicle>().When(request => request.Parameters.Any(p => p.Name == "vehicleCategory" && (VehicleCategory)p.GetValue(null, null) == VehicleCategory.Truck)); // 根据VehicleCategory参数匹配CarVehicle Bind<IVehicleInfo>().To<CarVehicle>().When(request => request.Parameters.Any(p => p.Name == "vehicleCategory" && (VehicleCategory)p.GetValue(null, null) == VehicleCategory.Car)); // 根据VehicleCategory参数匹配BusVehicle Bind<IVehicleInfo>().To<BusVehicle>().When(request => request.Parameters.Any(p => p.Name == "vehicleCategory" && (VehicleCategory)p.GetValue(null, null) == VehicleCategory.Bus)); } }
3. 调整调用代码使用自定义模块
确保初始化Kernel时加载自定义的绑定模块,而非空模块:
var kernel = new StandardKernel(new VehicleModule()); var vehicles = kernel.Get<IVehicleType>(); var truck = vehicles.GetVehicleType(VehicleCategory.Truck, false); truck.GetVehicleInformation();
可选:利用newVehicle参数控制实例生命周期
如果需要通过newVehicle参数控制是否创建新实例,可以在绑定中结合作用域调整:
Bind<IVehicleInfo>().To<TruckVehicle>() .When(request => request.Parameters.Any(p => p.Name == "vehicleCategory" && (VehicleCategory)p.GetValue(null, null) == VehicleCategory.Truck)) // newVehicle为true时创建新实例(Transient),为false时复用实例(与上下文同生命周期) .InScope(ctx => ctx.Parameters.First(p => p.Name == "newVehicle").GetValue(null, null) is bool isNew ? (isNew ? null : ctx) : ctx);
内容的提问来源于stack exchange,提问作者dot
相关产品推荐
相关产品推荐

