14

我有一个接口类:

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

我有多个实现相同接口的类

其中一个类如下所示:

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();
});
4

2 回答 2

14

我如何告诉 Ninject 我希望所有实现 IStartUpTask 的类都自动绑定到它们自己?

首先,让我告诉您,Ninject 会自动将所有类绑定到自身。你不需要为此做任何特别的事情。

话虽如此,我知道如果您想更改范围或附加名称或元数据,您可能需要显式绑定。在这种情况下,请继续阅读。

我不知道是否可以在 vanilla ninject 中做你想做的事情,但你可以使用ninject.extensions.conventions。使用这个库你可以写:

Kernel.Bind(x => 
    x.FromThisAssembly()
    .SelectAllClasses()
    .InheritedFrom<IStartUpTask>()
    .BindToSelf());
于 2013-03-08T09:58:52.020 回答
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)
   {
      ...
   }
}
于 2013-03-08T09:13:22.987 回答