我正在使用.Net 3.5和最终将成为Windows服务的控制台应用程序。
我发现的大多数示例都使用类似
的内容Bind<IWeapon>().To<Sword>();
我已将所有DLL作为参考包含在我的项目中,编译器仍在抱怨。我出错的地方有哪些线索?对不起,这可能是一个愚蠢的问题。
更新:只需注意一些似乎需要但未被引用的其他库。有像Castle Core这样的图书馆。这些应该包括在内吗?
答案 0 :(得分:7)
首先需要确保您正在执行的是在您重写的Load方法内的Ninject模块中执行绑定代码。
例如:
public class ApplicationModule : NinjectModule {
public override void Load() {
Bind<IWeapon>().To<Sword>();
// additional bindings continue ...
}
}
NinjectModule类继承了定义Ninject流畅绑定语法的类和接口,从而使Bind<T>()
方法在类的范围内可用。然后在实例化内核时将这些模块传递给Ninject内核:
var kernel = new StandardKernel(new ApplicationModule());
然后将调用传递给内核的每个模块的Load()
方法,并在执行的方法中包含绑定定义。
上面的例子将NinjectModule指定为基类;但是,这是针对Ninject的2.0版本。如果您使用的是Ninject 1.x,则基类将为StandardModule
。在任何一种情况下,都会覆盖load方法,并在那里发出绑定语句(两个版本都相似)。
进一步回答你的问题:
对于Ninject 1.x,所需的DLL是ninject.core.dll,而定义StandardModule的命名空间是Ninject.Core。
对于Ninhect 2.0,所需的DLL是ninject.dll,NinjectModule定义的命名空间是Ninject.Modules。
在这两种情况下,您可能需要引用更多名称空间,具体取决于绑定语句的复杂程度 - 即,如果您使用上下文绑定或范围绑定等,在Ninject 1.x的情况下,您可能还需要为这些更复杂的案例引用Ninject.Conditions.dll。
除非您使用Ninject的拦截功能,否则不需要引用Castle.Core,这是一个1.x核心功能,但是在2.0版本中是扩展名。
希望这有帮助。
答案 1 :(得分:0)
尝试进入项目属性(右键单击项目并单击属性)并将控制台应用程序重新定位到.Net Framework 3.5,它当前可能会说“.Net Framework 3.5 Client Profile”。我在过去遇到了同样的问题,但程序集无法正确引用。
希望这是问题,这有助于。