Ответ 1
Ну, это часто происходит при объявлении привязок, но загружаются другие модули, где этот модуль пытается разрешить привязку, которая еще не загружена. Это происходит потому, что List<INinjectModule>
может не быть в правильном порядке.
Если вы считаете, что это так. Следуйте этой резолюции.
Идея заключается в том, что для каждой сборки будет bootstapper
, где загрузчик будет отвечать за загрузку модулей в логическом порядке.
Рассмотрим интерфейс для bootstrapper (это мы будем использовать, чтобы найти загрузчик в сборке)
public interface INinjectModuleBootstrapper
{
IList<INinjectModule> GetModules();
}
Теперь рассмотрим вашу сборку DataAccess, внедрив INinjectModuleBootstrapper
:
public class DataAccessBootstrapper : INinjectModuleBootstrapper
{
public IList<INinjectModule> GetModules()
{
//this is where you will be considering priority of your modules.
return new List<INinjectModule>()
{
new DataObjectModule(),
new RepositoryModule(),
new DbConnectionModule()
};
//RepositoryModule cannot be loaded until DataObjectModule is loaded
//as it is depended on DataObjectModule and DbConnectionModule has
//dependency on RepositoryModule
}
}
Вот как вы обрезаете Bootstrapper
для всей своей сборки. Теперь, начиная с запуска вашей программы, нам нужен StandardKernel
, где загружаются все модули. Мы напишем примерно следующее:
var assemblies = AppDomain.CurrentDomain.GetAssemblies();
return BootstrapHelper.LoadNinjectKernel(assemblies);
И наш класс BootstrapperHelper
:
public static class BootstrapHelper
{
public static StandardKernel LoadNinjectKernel(IEnumerable<Assembly> assemblies)
{
var standardKernel = new StandardKernel();
foreach (var assembly in assemblies)
{
assembly
.GetTypes()
.Where(t =>
t.GetInterfaces()
.Any(i =>
i.Name == typeof(INinjectModuleBootstrapper).Name))
.ToList()
.ForEach(t =>
{
var ninjectModuleBootstrapper =
(INinjectModuleBootstrapper)Activator.CreateInstance(t);
standardKernel.Load(ninjectModuleBootstrapper.GetModules());
});
}
return standardKernel;
}
}