2011-11-28 73 views
2

我想做的事的這個線的東西:Ninject綁定,接口界面

kernel.Bind<IBootTaskA>().To<BootTaskA>().InSingletonScope(); 
kernel.Bind<IBootTaskB>().To<BootTaskB>().InSingletonScope(); 

kernel.Bind<IBootTask>().To<IBootTaskA>(); 
kernel.Bind<IBootTask>().To<IBootTaskB>(); 

這樣我就可以做到這一點:

public class Boot 
{ 
    public Boot(IBootTask[] bootTasks) 
    { 
      foreach(var task in bootTasks){task.Execute();} 
    } 
} 

,但我不能似乎涉及的接口綁定界面,任何人都知道這個方法?

+0

相關:http://stackoverflow.com/questions/3147996/binding-singleton-to-multiple-services-in-ninject –

+0

相關:http://stackoverflow.com/questions/10206049/ninject-is-it-possible-to-bind-different-interfaces-to-the -same實例-的-α- c –

回答

4

繼承人如何做到這一點。

public class Service : IServiceA, IServiceB {} 

this.Bind<Service>().ToSelf().InSingletonScope(); 
kernel.BindInterfaceToBinding<IServiceA, Service>(); 
kernel.BindInterfaceToBinding<IServiceB, Service>(); 

ninject擴展處理您所需要的。

https://github.com/ninject/ninject.extensions.contextpreservation/wiki/Bind-Interface-to-Binding

編輯:

在ninject 3這是稍微容易些,你不再需要contextpreservation,只需:

Bind<IServiceA,IServiceB>().To<Service>().InSingletonScope(); 
1

UPDATE:The V3 Bind overloads解決了很多問題。 Ninject沒有任何這種性質的構造(並且我不知道其他容器具有這樣的系統)。但是,Ninject並不具有這種性質的任何構造(並且我不知道其他容器具有這樣的系統)。

我懷疑某種形式的Conditional Bindings可能是最適合您的真正問題(我假設您沒有真正具有通用標記接口完全如您所示)。

或者你只是想找到一個結構來保持你的綁定幹?我個人會將上述表達爲與自定義.WithStandardTaskProperties擴展方法的兩個綁定,而不是4行。

+0

引發這個問題的真正問題是我實際上需要在其他地方以及引導裝載程序中注入這些內容。這意味着我實際上需要2個不同的實例綁定,一個獲得一個通用列表來加載,然後也得到一個單獨的實例進行操作。問題是,如果我將它們分開綁定,它們將轉到不同的單例實例。 –

+0

環顧四周 - 這個標籤有兩個答案,今年有答案,展示了「綁定......」.ToBinding(IIRC)構造 - 一個來自@Remo Gloor的答案(如果你是使用Ninject以任何方式,你應該去閱讀他所有的最佳答案作爲你的第一件事) –

+0

是啊ninject 3現在是這個相當不錯:) –