0

我从下面的链接中引用了这个例子。

http://blog.prabir.me/post/Dependency-Injection-%28DI%29-e28093-Hello-World-with-Ninject.aspx

using Ninject.Modules; 
using Prabir.NinjectSample.Provider;
using Prabir.NinjectSamples.Providers.ConsoleWriter;
using Prabir.NinjectSample.Providers.MessageBoxWriter;

namespace Prabir.NinjectSample.ConsoleApplication
{
 public class XDocModule : NinjectModule
{

    public override void Load()
    {
        Bind<IWriter>().To<ConsoleWriter>();
        Bind<XDoc>().ToSelf().InSingletonScope();
    }

}
}

Load()方法中,正在ConsoleWriterIWriter. 它看起来是静态的和硬编码的。即每次我打电话时IWriter,它都会初始化ConsoleWriter。如果我也想使用怎么办MessageBoxWriter。我将不得不更改Load()方法中的代码来实现这一点。我是否遗漏了任何东西,或者这就是 Ninject 的行为方式?

此外,Load()方法将被所有类型的接线调用。在其他课程中,我可能需要ConsoleReaderIReader. 在这种情况下,同样

Bind<IWriter>().To<ConsoleWriter>()
Bind<XDoc>().ToSelf().InSingletonScope()

也会受到打击。这是Ninject的预期方式吗?

让我更详细地解释我的问题。可以说我有一个下面给出的界面。

public interface IVehicle
{
 PrintSpecification();
}

我有三个实现上述接口的类。它们可以如图所示。

public class Car implements IVehicle
{      
 public void PrintSpecification()
 { Console.WriteLine("Specification for Car");}
}

public class Bus implements IVehicle
{
  public void PrintSpecification()
  { Console.WriteLine("Specification for Bus");}
}

public class Truck implements IVehicle
{
  public void PrintSpecification()
  { Console.WriteLine("Specification for Truck");}
}

现在在我的主程序中,我会有这样的东西。在这里,我使用 new 运算符创建了 Car、Bus 和 Truck 的三个具体实现。我必须显示所有三辆车的规格。现在我想知道如何编写我的 Ninject 代码,以便不依赖具体类。

Public static void main()
{
  IVehicle v1=new Car();
  IVehicle v2=new Bus();
  IVehicle v3=new Truck();
  v1.PrintSpecification();
  v2.PrintSpecification();
  v3.PrintSpecification();
}
4

2 回答 2

2

模块加载应该在应用程序启动时完成一次(或者您可以根据请求动态加载模块 - 在需要时,但可能不是您的情况)。

如果你想在不同的地方使用你的接口的各种实现,你可以使用条件绑定。

条件绑定:

Bind<IWriter>().To<ConsoleWriter>().When(x=> ReturnTrueWhenConditionMet());

或者您可以使用命名NamedAttribute

命名属性:

捆绑

Bind<IWriter>().To<ConsoleWriter>().Named("ConsoleWritter");

ConsoleWritter将被注入的类的构造函数。

public MyClassWithConcoleWritter([Named("ConsoleWritter")] IWriter writer)
{
}

问题NamedAttribute是它会将您绑定到您的商务课程中的 Ninject,因此如果您需要轻松切换 IOC 容器将会有问题。

然而,如何进行条件绑定还有更多选择。有关更多信息,请参阅此文档 -上下文绑定

于 2013-01-10T11:57:51.710 回答
0

你的第二个问题可以这样解决

在您的 ninject 模块中

Bind<IVehicle>().To<Car>();
Bind<IVehicle>().To<Bus>();
Bind<IVehicle>().To<Truck>();
Bind<IVehicleCarPark>().To<CarPark>();

在使用 ninject 检索的类中

public class CarPark : IVehicleCarPark
{
   Ctor(IEnumerable<IVehicle> vehicles) {
       // vehicles will be autoresolved
   }
}
于 2013-01-12T00:31:10.410 回答