Я возился с LightInject, чтобы попытаться настроить решение IoC, содержащее проект домена, проект инфраструктуры, проект MVC и проект DependencyResolution. Инфраструктура, MVC и DependencyResolution ссылаются на домен. MVC ссылается на DependencyResolution, а DependencyResolution ссылается на LightInject.
Идея заключается в том, что DependencyResolution регистрирует все необходимые зависимости при запуске приложения. В настоящее время он ничего не знает о контроллерах в проекте MVC. Вместо этого я настроил резервную процедуру, чтобы перехватывать все неизвестные классы контроллера MVC. Затем в резервной процедуре я регистрирую контроллер MVC и возвращаю его. Делая это, я ожидаю, что этот код будет запущен только один раз, поскольку только при первом обращении контроллер MVC еще не зарегистрирован. Но это не так. Вместо этого я получаю StackOverflowException, потому что резервная процедура срабатывает каждый раз, когда запрашивается контроллер MVC, даже если он был зарегистрирован в первый раз.
Так вот вопрос, почему так происходит? Является ли это ожидаемым поведением, и если да, то почему и как его обойти?
Редактировать. Ниже приведен исходный код.
[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(DependencyResolution.App_Start.WebCommon), "Start")]
namespace DependencyResolution.App_Start
{
static class WebCommon
{
private static readonly TempProject.LightInject.ServiceContainer _serviceContainer = new TempProject.LightInject.ServiceContainer();
/// <summary>
/// Starts the application
/// </summary>
public static void Start()
{
var container = _serviceContainer;
RegisterServices(container);
Domain.ServiceLocator.SetServiceLocator(() => new ServiceLocator(container));
}
/// <summary>
/// Load your modules or register your services here!
/// </summary>
/// <param name="container">The IoC container.</param>
private static void RegisterServices(TempProject.LightInject.ServiceContainer container)
{
System.Func<TempProject.LightInject.ServiceRequest, object> fallback = request =>
{
var serviceType = request.ServiceType;
container.Register(serviceType, serviceType);
return container.GetInstance(serviceType);
};
container.RegisterFallback((type, s) => type.Name.EndsWith("Controller"), request => fallback(request));
var assembly = typeof(Domain.IServiceLocator).Assembly;
container.RegisterAssembly(assembly);
}
}
}