55 lines
2.0 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|
|
} |