diff --git a/src/Orchard/Environment/ShellBuilders/ShellContainerFactory.cs b/src/Orchard/Environment/ShellBuilders/ShellContainerFactory.cs index 24a108c9c..c189ced00 100644 --- a/src/Orchard/Environment/ShellBuilders/ShellContainerFactory.cs +++ b/src/Orchard/Environment/ShellBuilders/ShellContainerFactory.cs @@ -89,10 +89,13 @@ namespace Orchard.Environment.ShellBuilders { } foreach (var item in blueprint.Controllers) { - var serviceKey = (item.AreaName + "/" + item.ControllerName).ToLowerInvariant(); + var serviceKeyName = (item.AreaName + "/" + item.ControllerName).ToLowerInvariant(); + var serviceKeyType = item.Type; RegisterType(builder, item) .EnableDynamicProxy(dynamicProxyContext) - .Keyed(serviceKey) + .Keyed(serviceKeyName) + .Keyed(serviceKeyType) + .WithMetadata("ControllerType", item.Type) .InstancePerDependency() .OnActivating(e => { var controller = e.Instance as Controller; diff --git a/src/Orchard/Mvc/OrchardControllerFactory.cs b/src/Orchard/Mvc/OrchardControllerFactory.cs index 8e85305e2..8313eae87 100644 --- a/src/Orchard/Mvc/OrchardControllerFactory.cs +++ b/src/Orchard/Mvc/OrchardControllerFactory.cs @@ -1,12 +1,33 @@ +using System; using System.Web.Mvc; using System.Web.Routing; using Autofac; using Autofac.Core; +using Autofac.Features.Metadata; namespace Orchard.Mvc { + public interface IControllerType { + Type ControllerType { get; } + } + public class OrchardControllerFactory : DefaultControllerFactory { - public override IController CreateController(RequestContext requestContext, string controllerName) { + bool TryResolve(RequestContext requestContext, object serviceKey, out T instance ) { + var workContext = requestContext.GetWorkContext(); + if (workContext != null) { + var key = new KeyedService(serviceKey, typeof (T)); + object value; + if (workContext.Resolve().TryResolve(key, out value)) { + instance = (T) value; + return true; + } + } + + instance = default(T); + return false; + } + + protected override Type GetControllerType(RequestContext requestContext, string controllerName) { var routeData = requestContext.RouteData; // Determine the area name for the request, and fall back to stock orchard controllers @@ -15,18 +36,24 @@ namespace Orchard.Mvc { // Service name pattern matches the identification strategy var serviceKey = (areaName + "/" + controllerName).ToLowerInvariant(); - // Now that the request container is known - try to resolve the controller - object controller; - var service = new KeyedService(serviceKey, typeof(IController)); - - var workContext = requestContext.GetWorkContext(); - - if (workContext != null && - workContext.Resolve().TryResolve(service, out controller)) { - return (IController)controller; + // Now that the request container is known - try to resolve the controller information + Lazy info; + if (TryResolve(requestContext, serviceKey, out info)) { + return info.Metadata.ControllerType; } - return base.CreateController(requestContext, controllerName); + // fail as appropriate for MVC's expectations + return null; + } + + protected override IController GetControllerInstance(RequestContext requestContext, System.Type controllerType) { + IController controller; + if (TryResolve(requestContext, controllerType, out controller)) { + return controller; + } + + // fail as appropriate for MVC's expectations + return null; } public static string GetAreaName(RouteBase route) { diff --git a/src/Orchard/Orchard.Framework.csproj b/src/Orchard/Orchard.Framework.csproj index ba6bd74ad..ef8ec7b58 100644 --- a/src/Orchard/Orchard.Framework.csproj +++ b/src/Orchard/Orchard.Framework.csproj @@ -114,6 +114,7 @@ ..\..\lib\linqnhibernate\NHibernate.Linq.dll + 3.5