【发布时间】:2020-07-12 03:51:46
【问题描述】:
我有一个使用 Ninject 作为其 DI 的应用程序。我正在添加一些新类,但它们并没有像我认为的那样得到解决。
我有一个类Foo,它实现了一个接口ISomething。如果我像这样配置绑定:
kernel.Bind<Foo>().ToSelf().InSingletonScope();
kernel.Bind<ISomething>().To<Foo>();
然后做:
var foo1 = kernel.Get<Foo>();
var foo2 = kernel.Get<ISomething>();
这两个变量有不同的 Foo 类实例。
如果我将绑定更改为:
kernel.Bind<Foo>().ToSelf().InSingletonScope();
kernel.Bind<ISomething>().ToMethod(ctx => ctx.Kernel.Get<Foo>());
然后做:
var foo1 = kernel.Get<Foo>();
var foo2 = kernel.Get<ISomething>();
这两个变量具有相同的实例。
我的理解是,在第一种情况下,它应该将ISomething 解析为Foo,而后者又会解析为自身的单例。是我的理解不正确,还是有其他问题?手动解决似乎有点多余。
【问题讨论】:
-
是否可以这样做
kernel.Bind<ISomething>().To<Foo>().InSingletonScope();并且您仍然得到两个实例? -
我仍然得到两个不同的实例。
-
太糟糕了。我希望 Ninject 能做一些内部魔法并解决相同的范围......但显然这不起作用。
-
@adrianbanks 您对 Ninject 的理解不正确。这些是两个单独的注册,因此是两个单独的实例。同样的方法也发生在 .net 核心上,你还必须使用委托工厂
service.AddSingleton<ISomething>(_ => _.GetService<Foo>());
标签: c# dependency-injection ninject