gpt4 book ai didi

c# - 使用 Ninject,我可以在不公开具体类的情况下从接口(interface)创建实例吗?

转载 作者:可可西里 更新时间:2023-11-01 09:03:22 25 4
gpt4 key购买 nike

目前我看到的样本是这样的:

像这样写你的代码......

public class Samurai {
public IWeapon Weapon { get; private set; }
public Samurai(IWeapon weapon) {
Weapon = weapon;
}
}

Ninject 可以像这样将接口(interface)映射到具体类型...

public class WarriorModule : NinjectModule {
public override void Load() {
Bind<IWeapon>().To<Sword>();
}
}

所以当我说 var samurai = kernel.Get<Samurai>();在我的 Samurai 对象中,我的 IWeapon 自动是一把剑。

这很酷,但是如果我只想要没有 Samurai 的 ISword 并且混凝土剑被标记为内部怎么办?

目前,我使用自制的依赖解析器,我可以在其中说 var sword = DependencyResolver.Current.Resolve<ISword>();它还给了我一把铸成 ISword 的剑。我的具体类被标记为内部类,因此开发人员必须通过我的依赖解析器来创建一个实例。 Ninject 有类似的东西吗?

还有一个额外的问题,我用自定义的“DefaultConcreteType”属性装饰我的接口(interface),如果不存在映射,我的依赖项解析器可以使用该属性。 Ninject 也有类似的东西吗?

谢谢

最佳答案

当您将接口(interface)绑定(bind)到具体类型时,您可以请求该接口(interface)的实例并获得具体类型。在您的示例中,您可以这样做:

var sword = kernel.Get<ISword>();

这会给你一个具体的 Sword目的。您还可以使用绑定(bind)系统做更多的事情。你甚至可以 Bind<ISword>().ToMethod(MySwordFactory);并编写一个方法来根据请求的上下文获取 Swords。

您可以做的另一件事是根据注入(inject)的类型更改绑定(bind)的工作方式。例如,您可以像这样公开自定义类的属性:

public class MyClass {
[Inject]
public ISword Sword { get; set; }
}

然后您可以绑定(bind)到基于 MyClass 的特定 ISword 实现:

Bind<ISword>().To<Sword>().WhenInjectedInto<MyClass>();

还有很多选项,但这应该给您一个粗略的概览。

关于c# - 使用 Ninject,我可以在不公开具体类的情况下从接口(interface)创建实例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5314886/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com