2013-03-08 101 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

相关问题