2013-03-08 105 views
12

我有一個接口類:Ninject綁定的所有類實現相同的接口

public interface IStartUpTask 
{ 
    bool IsEnabled { get; } 
    void Configure(); 
} 

我必須實現相同的接口

其中一個類看起來像這樣multimple類:

public class Log4NetStartUpTask : IStartUpTask 
{ 
    public bool IsEnabled { get { return true; } } 

    public void Configure() 
    { 
     string log4netConfigFilePath = ConfigurationManager.AppSettings["log4netConfigFilePath"]; 
     if (log4netConfigFilePath == null) 
      throw new Exception("log4netConfigFilePath configuration is missing"); 

     if (File.Exists(log4netConfigFilePath) == false) 
      throw new Exception("Log4Net configuration file was not found"); 

     log4net.Config.XmlConfigurator.Configure(
      new System.IO.FileInfo(log4netConfigFilePath)); 
    } 
} 

我如何告訴Ninject我希望所有實現IStartUpTask的類自動綁定到自己?

我找到了一個使用StructureMap的例子,但是我不知道如何在Ninject中做到這一點。

Scan(x => { 
    x.AssemblyContainingType<IStartUpTask>(); 
    x.AddAllTypesOf<IStartUpTask>(); 
    x.WithDefaultConventions(); 
}); 

回答

12

我怎麼能告訴Ninject,我想所有的類實現 IStartUpTask自動綁定到自己?

首先,讓我告訴你,Ninject自動綁定所有的類。你不需要做任何特別的事情。如上所述,我知道如果您想要更改範圍或附加名稱或元數據,您可能需要顯式綁定。在這種情況下,請繼續閱讀。

我不知道是否有可能做你以後在香草ninject,但你可以使用ninject.extensions.conventions。使用這個庫你可以這樣寫:

Kernel.Bind(x => 
    x.FromThisAssembly() 
    .SelectAllClasses() 
    .InheritedFrom<IStartUpTask>() 
    .BindToSelf()); 
+2

這種爲我工作,但我不得不做'BindSingleInterface',而不是BindToSelf。但不管怎麼說,我的訣竅是'InheritedFrom'位。感謝名單! – noocyte 2013-08-13 05:44:48

+0

我發現了這個解決方案,但它對我來說「不起作用」。我花了一段時間才發現原因,所以我在此添加它以添加更多上下文。 默認情況下,Ninject只綁定公共類,如果要綁定內部類,則必須調用'IncludingNonePublicTypes()'方法。 – mivra 2017-02-20 18:06:50

2

你可以調用它明確在你的代碼:

... 
Bind<IStartUpTask>().To<Log4NetStartUpTask>(); 
Bind<IStartUpTask>().To<SomeOtherStartUpTask>(); 
... 

使用它在SomeClass的

public class SomeClass 
{ 
    private readonly List<IStartUpTask> startUpTaskList; 

    public SomeClass(IEnumerable<IStartUpTask> startUpTaskList) 
    { 
     this.startUpTaskList = startUpTaskList; 
    } 

    foreach (var startUpTask in this.startUpTaskList) 
    { 
     ... 
    } 
} 
+0

最後一個綁定不會覆蓋前面的那個? – Catalin 2013-03-08 09:14:50

+0

@MikroDel:在你的例子中,當需要IStartUpTask接口時,哪個類將被注入?這看起來不對。 – 2013-03-08 09:19:35

+0

@RaraituL我已更新我的答案,以便於理解 – MikroDel 2013-03-08 09:21:21

相關問題