ada*_*101 10 c# dependency-injection ninject inversion-of-control
我到目前为止看到的样本看起来像这样:
像这样写你的代码......
public class Samurai {
public IWeapon Weapon { get; private set; }
public Samurai(IWeapon weapon) {
Weapon = weapon;
}
}
Run Code Online (Sandbox Code Playgroud)
Ninject可以将界面映射到这样的具体类型......
public class WarriorModule : NinjectModule {
public override void Load() {
Bind<IWeapon>().To<Sword>();
}
}
Run Code Online (Sandbox Code Playgroud)
因此,当我var samurai = kernel.Get<Samurai>();在我的武士对象中说我的IWeapon自动成为剑.
这很酷,但如果我只想要没有武士的ISword并且混凝土剑被标记为内部怎么办?
目前,我使用自制的依赖解析器,我可以说var sword = DependencyResolver.Current.Resolve<ISword>();,它给了我一个Sword演员作为ISword.我的具体类被标记为内部,因此开发人员必须通过我的依赖项解析器来创建实例.Ninject有类似的东西吗?
还有一个额外的问题,我用自定义的"DefaultConcreteType"属性装饰我的接口,如果不存在映射,我的依赖解析器可以使用该属性.Ninject也有类似的东西吗?
谢谢
Sco*_*son 15
将接口绑定到具体类型时,可以请求该接口的实例并获取具体类型.在您的示例中,您可以这样做:
var sword = kernel.Get<ISword>();
Run Code Online (Sandbox Code Playgroud)
这会给你一个具体的Sword对象.您也可以使用绑定系统做更多事情.您甚至Bind<ISword>().ToMethod(MySwordFactory);可以根据请求上下文编写一个方法来获取Swords.
您可以做的另一件事是根据注入的类型更改如何绑定工作.例如,您可以在自定义类上公开属性,如下所示:
public class MyClass {
[Inject]
public ISword Sword { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后你可以绑定到基于MyClass的特定ISword实现:
Bind<ISword>().To<Sword>().WhenInjectedInto<MyClass>();
Run Code Online (Sandbox Code Playgroud)
有很多选项,但这应该给你一个粗略的概述.