私は LightInject をいじって、ドメイン プロジェクト、インフラストラクチャ プロジェクト、MVC プロジェクト、および DependencyResolution プロジェクトを含む IoC ソリューションをセットアップしようとしています。インフラストラクチャ、MVC、および DependencyResolution はドメインを参照します。MVC は DependencyResolution を参照し、DependencyResolution は LightInject を参照します。
DependencyResolution は、アプリの起動時に必要なすべての依存関係を登録するという考え方です。現時点では、MVC プロジェクト内のコントローラーは認識されていません。代わりに、未知の MVC コントローラー クラスをすべてキャッチするフォールバック ルーチンをセットアップしました。フォールバック ルーチンでは、MVC コントローラーを登録して返します。これを行うことで、MVC コントローラーがまだ登録されていない最初のヒットによってのみ実行されるため、このコードは 1 回だけ実行されることが期待されます。しかし、そうではありません。代わりに、最初に登録されたにもかかわらず、MVC コントローラーが要求されるたびにフォールバック ルーチンがヒットするため、StackOverflowException が発生します。
では、問題は、なぜこれが起こるのかということです。これは予想される動作ですか? もしそうなら、なぜですか? また、それを回避する方法はありますか?
編集:これが以下のソースコードです。
[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);
}
}
}