Dot-Net

在 Ninject 中將單例綁定到多個服務

  • October 20, 2017

我有一個問題,看起來與http://markmail.org/message/6rlrzkgyx3pspmnf中描述的問題非常相似,如果您使用不同的服務類型訪問它,單例實際上會創建多個實例。

我正在使用最新版本的 Ninject 2 for Compact Framework,我遇到的確切問題是,如果我將相同的提供程序方法綁定到:

Func<Service> serviceCreator = () => new Service(false);
kernel.Bind<IService>().ToMethod(serviceCreator).InSingletonScope();
kernel.Bind<Service>().ToMethod(serviceCreator).InSingletonScope();

如果我同時解析為 IService 和 Service,它似乎正在創建 2 個服務實例。

這在解析 Service 時會導致循環依賴異常。

這是設計使然,還是錯誤?

在 V3 中,終於有了新的重載Bind形式的解決方案,請參閱相關:問題


如果要共享單例,則需要將第二個更改Bind為:

kernel.Bind<Service>().ToMethod(()=>kernel.Get<IService>()).InSingletonScope();

再循環引用和混淆等。內部隱式自綁定將為服務添加隱式綁定註冊。您應該發布異常。

編輯:重新發表您的評論。如果你這樣做:

Func<Service> serviceCreator = () => new Service(false);
kernel.Bind<Service>().ToMethod(serviceCreator).InSingletonScope();
kernel.Bind<IService>().ToMethod(()=>kernel.Get<Service>()).InSingletonScope();

然後在 Resolved 時不會生成隱式 Class Self Binding IService- 它使用現有的。

最近幾週這裡有另一個關於 SO 的問題,有人正在做這類事情,但遇到了 IInitializable 的問題- 該範例的順序正確,但根據我對原始碼的閱讀和輸入方式,上述範例是有道理的它生成隱式類自綁定。

引用自:https://stackoverflow.com/questions/3147996