使用Ninject,我可以从接口创建一个实例而不暴露我的具体类吗?

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)

有很多选项,但这应该给你一个粗略的概述.