Что ж, это часто случается, когда привязки объявляются, но другие модули загружаются там, где этот модуль пытается разрешить привязку, которая еще не загружена. Это происходит потому, что List<INinjectModule>
может не в правильном порядке.
Если вы думаете, что это так. Следуйте этой резолюции.
Идея в том, что у нас будет bootstapper
для каждой сборки, где загрузчик будет отвечать за загрузку модулей в логическом порядке.
Давайте рассмотрим интерфейс для загрузчика (это мы будем использовать, чтобы найти загрузчик в сборке)
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;
}
}