为什么我不能在Ninject Extension Factory中使用Get <classnameofconcreteinstance>作为方法名?</classnameofconcreteinstance>

时间:2014-03-10 18:11:09

标签: ninject naming-conventions factory ninject-extensions

看看这个非常简单的例子:调用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”而工作。

谢谢!

1 个答案:

答案 0 :(得分:1)

是的,有一个convention Get 用于使用命名绑定获取实例。工厂扩展为您生成代码,因此您无需为工厂创建样板代码。如果你不想,你不需要使用它。

但如果你这样做,你必须遵守其惯例。使用创建构建实例,使用获取通过命名绑定检索实例。

所有这些都记录在wiki