Files
laatzen/LaaProductionWeb/LaaProductionWeb/App_Infrastructure/ControllerFactory.cs
T
2023-04-04 11:12:07 +02:00

55 lines
2.0 KiB
C#

namespace LaaProductionWeb.App_Infrastructure
{
using System;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using System.Web.SessionState;
public class ControllerFactory : IControllerFactory
{
const string AREAS_PATTERN = "LaaProductionWeb.Areas.{0}.Controllers.{1}Controller";
const string CONTROLLERS_PATTERN = "LaaProductionWeb.Controllers.{0}Controller";
private readonly IServiceProvider serviceProvider;
public ControllerFactory(IServiceProvider serviceProvider)
=> this.serviceProvider = serviceProvider;
public IController CreateController(RequestContext requestContext, string controllerName)
{
var controllerTypeName = requestContext.RouteData.Values.TryGetValue("area", out object areaName)
? string.Format(AREAS_PATTERN, areaName, controllerName)
: string.Format(CONTROLLERS_PATTERN, controllerName);
var controllerType = Type.GetType(controllerTypeName, throwOnError: false, ignoreCase: true);
this.RedirectToDefault(controllerType, requestContext.HttpContext.Response);
var controller = this.serviceProvider.GetService(controllerType) as IController;
this.RedirectToDefault(controller, requestContext.HttpContext.Response);
return controller;
}
public SessionStateBehavior GetControllerSessionBehavior(RequestContext requestContext, string controllerName)
=> SessionStateBehavior.Default;
public void ReleaseController(IController controller)
{
if (controller is IDisposable disposable)
{
disposable.Dispose();
}
}
private void RedirectToDefault(object resource, HttpResponseBase response)
{
if (resource is null)
{
response.Redirect("/");
response.End();
}
}
}
}