Подтвердить что ты не робот

Ninject связывает все классы, реализующие один и тот же интерфейс

У меня есть класс интерфейса:

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

Ответ 1

Как я могу сказать Ninject, что мне нужны все классы, реализующие IStartUpTask автоматически привязываться к ним?

Прежде всего, позвольте мне сказать вам, что Ninject автоматически связывает все классы. Вам не нужно ничего делать для этого.

Сказав это, я понимаю, что вам может понадобиться явное связывание, если вы хотите изменить область действия или прикрепить имена или метаданные. В этом случае чтение.

Я не знаю, можно ли делать то, что вам нужно, в vanino ninject, но вы можете использовать ninject.extensions.conventions. Используя эту библиотеку, вы можете написать:

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

Ответ 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)
   {
      ...
   }
}