I use ninject and ninject factory extension as follows:
I created two interfaces, the first interface is for the factory and the second is for the concrete class to be injected depending on the arguments at the factory method.
The factory interface:
public enum VehicleCategory
{
Bus,
Car,
Truck
}
public interface IVehicleType
{
IVehicleMethods GetVehicleType(VehicleCategory vehicleCategory, bool newVehicle);
}
The class interface:
public interface IVehicleInfo
{
string GetVehicleInformation();
}
The ninject binding:
Bind<IVehicleType>().ToFactory();
Bind<IVehicleInfo>().To<TruckVehicle>().NamedLikeFactoryMethod((IVehicleType f) =>
f.GetVehicleType(VehicleCategory.Truck, false);
Bind<IVehicleInfo>().To<CarVehicle>().NamedLikeFactoryMethod((IVehicleType f) =>
f.GetVehicleType(VehicleCategory.Car, false);
Bind<IVehicleInfo>().To<BusVehicle>().NamedLikeFactoryMethod((IVehicleType f) =>
f.GetVehicleType(VehicleCategory.Bus, false);
The inject call:
var kernel = new StandardKernel(new NinjectModule());
var vehicles = kernel.Get<IVehicleType>();
var truck = vehicles.GetVehicleType(VehicleCategory.Truck, false);
truck.GetVehicleInformation();
Currently I get the error "More than one matching binging are available", so I assume the method parameters does not matter. What should I change so that the correct object is created/injected depending on the method parameters?
You may try something like this :
then
and
and this should not change