看看这个非常简单的例子:调用CreateCar它可以工作,调用GetCar失败,说“错误激活ICar:没有匹配的绑定可用,并且类型不可自绑定”。 / p>
public interface ICar { }
public class Car : ICar
{
public Car(string carType) { }
}
public interface ICarFactory
{
ICar CreateCar(string carType); // this is fine
ICar GetCar(string carType); // this is bad
}
public class CarModule : NinjectModule
{
public override void Load()
{
Bind<ICarFactory>().ToFactory();
Bind<ICar>().To<Car>();
}
}
public class Program
{
public static void Main()
{
using (var kernel = new StandardKernel(new FuncModule(), new CarModule()))
{
var factory = kernel.Get<ICarFactory>();
var car1 = factory.CreateCar("a type");
var car2 = factory.GetCar("another type");
}
}
}
假设它必须与Get * ClassName *的某种约定相关(类似于 NamedLikeFactoryMethod 的东西)。有没有办法避免应用这个约定?我不需要它而且我不需要它(我已经浪费了太多时间试图弄清楚为什么绑定失败了,只是运气,我在我的10个工厂中的一个做了一个错字,我注意到它只是因为工厂方法名称是“Ger”而不是“Get”而工作。
谢谢!
答案 0 :(得分:1)
是的,有一个convention, Get 用于使用命名绑定获取实例。工厂扩展为您生成代码,因此您无需为工厂创建样板代码。如果你不想,你不需要使用它。
但如果你这样做,你必须遵守其惯例。使用创建构建实例,使用获取通过命名绑定检索实例。
所有这些都记录在wiki。
中