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