From 0ff15f262a7dc33ce750f4521300e7c4c741837b Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 24 Nov 2010 15:09:25 -0800 Subject: [PATCH 01/11] Updating profiling build target --HG-- branch : perf --- Orchard.proj | 39 +++++++++++-------- .../profiling-setup-commands.txt | 2 +- 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/Orchard.proj b/Orchard.proj index 27c19a333..73d32de78 100644 --- a/Orchard.proj +++ b/Orchard.proj @@ -63,12 +63,12 @@ - + - + @@ -123,7 +123,7 @@ - + @@ -134,8 +134,8 @@ - - + + @@ -195,11 +195,11 @@ - + - + @@ -232,7 +232,7 @@ $(StageFolder)\**\Modules\Orchard.MultiTenancy\**; $(StageFolder)\**\Modules\Orchard.Search\**; " /> - + @@ -289,10 +289,18 @@ + + - + + + + + @@ -303,7 +311,6 @@ - @@ -321,12 +328,12 @@ - + - + @@ -338,10 +345,10 @@ ReplacementText="${1}${2}:${3}$(Version)" IgnoreCase="True"/> - + Date: Wed, 24 Nov 2010 18:53:47 -0800 Subject: [PATCH 02/11] Perf - updating profiling specflow test Doing 4 groups of 10, to see get a sense of variance --HG-- branch : perf --- src/Orchard.Profile/Tests/Profiling.feature | 7 +++- .../Tests/Profiling.feature.cs | 42 ++++++++++--------- 2 files changed, 28 insertions(+), 21 deletions(-) diff --git a/src/Orchard.Profile/Tests/Profiling.feature b/src/Orchard.Profile/Tests/Profiling.feature index 267b90d37..cadf674cb 100644 --- a/src/Orchard.Profile/Tests/Profiling.feature +++ b/src/Orchard.Profile/Tests/Profiling.feature @@ -22,5 +22,8 @@ Scenario: Hitting blogs When I go to "/blog4" 10 times Scenario: Hitting home page - Given I am logged in - When I go to "/" 40 times + //Given I am logged in + When I go to "/" 10 times + When I go to "/" 10 times + When I go to "/" 10 times + When I go to "/" 10 times diff --git a/src/Orchard.Profile/Tests/Profiling.feature.cs b/src/Orchard.Profile/Tests/Profiling.feature.cs index ae57373ee..75bb2fb49 100644 --- a/src/Orchard.Profile/Tests/Profiling.feature.cs +++ b/src/Orchard.Profile/Tests/Profiling.feature.cs @@ -1,7 +1,7 @@ // ------------------------------------------------------------------------------ // // This code was generated by SpecFlow (http://www.specflow.org/). -// SpecFlow Version:1.3.2.0 +// SpecFlow Version:1.4.0.0 // Runtime Version:4.0.30319.1 // // Changes to this file may cause incorrect behavior and will be lost if @@ -9,12 +9,12 @@ // // ------------------------------------------------------------------------------ #region Designer generated code -namespace Orchard.Specs.Le.Tests +namespace Orchard.Profile.Tests { using TechTalk.SpecFlow; - [System.CodeDom.Compiler.GeneratedCodeAttribute("TechTalk.SpecFlow", "1.3.2.0")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("TechTalk.SpecFlow", "1.4.0.0")] [System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [NUnit.Framework.TestFixtureAttribute()] [NUnit.Framework.DescriptionAttribute("Profiling")] @@ -31,7 +31,7 @@ namespace Orchard.Specs.Le.Tests { testRunner = TechTalk.SpecFlow.TestRunnerManager.GetTestRunner(); TechTalk.SpecFlow.FeatureInfo featureInfo = new TechTalk.SpecFlow.FeatureInfo(new System.Globalization.CultureInfo("en-US"), "Profiling", "In order to profile the site\r\nAs a developer\r\nI want to generate a fixed number o" + - "f repeatable requests", ((string[])(null))); + "f repeatable requests", GenerationTargetLanguage.CSharp, ((string[])(null))); testRunner.OnFeatureStart(featureInfo); } @@ -61,13 +61,13 @@ namespace Orchard.Specs.Le.Tests #line 6 this.ScenarioSetup(scenarioInfo); #line 7 -testRunner.Given("I am logged in"); + testRunner.Given("I am logged in"); #line 8 -testRunner.When("I go to \"/admin\""); + testRunner.When("I go to \"/admin\""); #line 9 -testRunner.When("I go to \"/blog0\""); + testRunner.When("I go to \"/blog0\""); #line 10 -testRunner.When("I go to \"/\""); + testRunner.When("I go to \"/\""); #line hidden testRunner.CollectScenarioErrors(); } @@ -80,9 +80,9 @@ testRunner.When("I go to \"/\""); #line 12 this.ScenarioSetup(scenarioInfo); #line 13 -testRunner.Given("I am logged in"); + testRunner.Given("I am logged in"); #line 14 -testRunner.When("I go to \"/admin\" 40 times"); + testRunner.When("I go to \"/admin\" 40 times"); #line hidden testRunner.CollectScenarioErrors(); } @@ -95,17 +95,17 @@ testRunner.When("I go to \"/admin\" 40 times"); #line 16 this.ScenarioSetup(scenarioInfo); #line 17 -testRunner.Given("I am logged in"); + testRunner.Given("I am logged in"); #line 18 -testRunner.When("I go to \"/blog0\" 10 times"); + testRunner.When("I go to \"/blog0\" 10 times"); #line 19 -testRunner.When("I go to \"/blog1\" 10 times"); + testRunner.When("I go to \"/blog1\" 10 times"); #line 20 -testRunner.When("I go to \"/blog2\" 10 times"); + testRunner.When("I go to \"/blog2\" 10 times"); #line 21 -testRunner.When("I go to \"/blog3\" 10 times"); + testRunner.When("I go to \"/blog3\" 10 times"); #line 22 -testRunner.When("I go to \"/blog4\" 10 times"); + testRunner.When("I go to \"/blog4\" 10 times"); #line hidden testRunner.CollectScenarioErrors(); } @@ -117,10 +117,14 @@ testRunner.When("I go to \"/blog4\" 10 times"); TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Hitting home page", ((string[])(null))); #line 24 this.ScenarioSetup(scenarioInfo); -#line 25 -testRunner.Given("I am logged in"); #line 26 -testRunner.When("I go to \"/\" 40 times"); + testRunner.When("I go to \"/\" 10 times"); +#line 27 + testRunner.When("I go to \"/\" 10 times"); +#line 28 + testRunner.When("I go to \"/\" 10 times"); +#line 29 + testRunner.When("I go to \"/\" 10 times"); #line hidden testRunner.CollectScenarioErrors(); } From 493fb03afef45baef0559fa49676f599aa9beaa0 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 24 Nov 2010 18:57:42 -0800 Subject: [PATCH 03/11] PERF: CreateWorkContextScope shouldn't call InstancePerMatchingLifetimeScope http://orchard.codeplex.com/workitem/16869 CreateWorkContextScope now creates a child container with no alteration to the component registry WorkContextModule added to group the related set of component registrations HttpContextBase still injectable, but it's exposed in a way that doesn't require updating the child container per request --HG-- branch : perf --- .../Routable/Services/RoutableServiceTests.cs | 2 +- .../DefaultWorkContextAccessorTests.cs | 2 +- .../DefaultShellContextFactoryTests.cs | 2 +- .../State/DefaultProcessingEngineTests.cs | 2 +- .../Localization/CultureManagerTests.cs | 2 +- .../Mvc/Routes/ShellRouteTests.cs | 2 +- .../Tasks/SweepGeneratorTests.cs | 2 +- src/Orchard.Tests/UI/ShapeTests.cs | 2 +- .../Modules/Orchard.Setup/SetupMode.cs | 4 +- ...textAccessor.cs => WorkContextAccessor.cs} | 70 ++----------------- .../Environment/WorkContextImplementation.cs | 45 ++++++++++++ src/Orchard/Environment/WorkContextModule.cs | 24 +++++++ .../Environment/WorkContextProperty.cs | 5 ++ src/Orchard/IWorkContextAccessor.cs | 2 +- src/Orchard/Orchard.Framework.csproj | 5 +- 15 files changed, 96 insertions(+), 75 deletions(-) rename src/Orchard/Environment/{DefaultWorkContextAccessor.cs => WorkContextAccessor.cs} (60%) create mode 100644 src/Orchard/Environment/WorkContextImplementation.cs create mode 100644 src/Orchard/Environment/WorkContextModule.cs create mode 100644 src/Orchard/Environment/WorkContextProperty.cs diff --git a/src/Orchard.Core.Tests/Routable/Services/RoutableServiceTests.cs b/src/Orchard.Core.Tests/Routable/Services/RoutableServiceTests.cs index 62493aaab..c696c8b75 100644 --- a/src/Orchard.Core.Tests/Routable/Services/RoutableServiceTests.cs +++ b/src/Orchard.Core.Tests/Routable/Services/RoutableServiceTests.cs @@ -46,7 +46,7 @@ namespace Orchard.Core.Tests.Routable.Services { builder.RegisterInstance(new Mock().Object); builder.RegisterInstance(new Mock().Object); builder.RegisterType().As(); - builder.RegisterType().As(); + builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); diff --git a/src/Orchard.Tests/Environment/DefaultWorkContextAccessorTests.cs b/src/Orchard.Tests/Environment/DefaultWorkContextAccessorTests.cs index 8edd2de91..5de77cf97 100644 --- a/src/Orchard.Tests/Environment/DefaultWorkContextAccessorTests.cs +++ b/src/Orchard.Tests/Environment/DefaultWorkContextAccessorTests.cs @@ -22,7 +22,7 @@ namespace Orchard.Tests.Environment { } protected override void Register(ContainerBuilder builder) { - builder.RegisterType().As(); + builder.RegisterType().As(); builder.RegisterAutoMocking(); } diff --git a/src/Orchard.Tests/Environment/ShellBuilders/DefaultShellContextFactoryTests.cs b/src/Orchard.Tests/Environment/ShellBuilders/DefaultShellContextFactoryTests.cs index 56a96df61..4857f4b72 100644 --- a/src/Orchard.Tests/Environment/ShellBuilders/DefaultShellContextFactoryTests.cs +++ b/src/Orchard.Tests/Environment/ShellBuilders/DefaultShellContextFactoryTests.cs @@ -21,7 +21,7 @@ namespace Orchard.Tests.Environment.ShellBuilders { public void Init() { var builder = new ContainerBuilder(); builder.RegisterType().As(); - builder.RegisterType().As(); + builder.RegisterType().As(); builder.RegisterAutoMocking(Moq.MockBehavior.Strict); _container = builder.Build(); } diff --git a/src/Orchard.Tests/Environment/State/DefaultProcessingEngineTests.cs b/src/Orchard.Tests/Environment/State/DefaultProcessingEngineTests.cs index e35a2f401..d564bb24c 100644 --- a/src/Orchard.Tests/Environment/State/DefaultProcessingEngineTests.cs +++ b/src/Orchard.Tests/Environment/State/DefaultProcessingEngineTests.cs @@ -23,7 +23,7 @@ namespace Orchard.Tests.Environment.State { public void Init() { var builder = new ContainerBuilder(); builder.RegisterType().As(); - builder.RegisterType().As(); + builder.RegisterType().As(); builder.RegisterAutoMocking(); _container = builder.Build(); diff --git a/src/Orchard.Tests/Localization/CultureManagerTests.cs b/src/Orchard.Tests/Localization/CultureManagerTests.cs index 9d202c2d0..4a0d9e1ce 100644 --- a/src/Orchard.Tests/Localization/CultureManagerTests.cs +++ b/src/Orchard.Tests/Localization/CultureManagerTests.cs @@ -51,7 +51,7 @@ namespace Orchard.Tests.Localization { builder.RegisterInstance(new Mock().Object); builder.RegisterInstance(new Mock().Object); builder.RegisterType().As(); - builder.RegisterType().As(); + builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); diff --git a/src/Orchard.Tests/Mvc/Routes/ShellRouteTests.cs b/src/Orchard.Tests/Mvc/Routes/ShellRouteTests.cs index 80a99f72f..33bbfb968 100644 --- a/src/Orchard.Tests/Mvc/Routes/ShellRouteTests.cs +++ b/src/Orchard.Tests/Mvc/Routes/ShellRouteTests.cs @@ -36,7 +36,7 @@ namespace Orchard.Tests.Mvc.Routes { rootBuilder.Register(ctx => _routes); rootBuilder.RegisterType().InstancePerDependency(); rootBuilder.RegisterType().As().SingleInstance(); - rootBuilder.RegisterType().As().InstancePerMatchingLifetimeScope("shell"); + rootBuilder.RegisterType().As().InstancePerMatchingLifetimeScope("shell"); rootBuilder.RegisterType().As(); _rootContainer = rootBuilder.Build(); diff --git a/src/Orchard.Tests/Tasks/SweepGeneratorTests.cs b/src/Orchard.Tests/Tasks/SweepGeneratorTests.cs index 9e0469631..9bb99fa08 100644 --- a/src/Orchard.Tests/Tasks/SweepGeneratorTests.cs +++ b/src/Orchard.Tests/Tasks/SweepGeneratorTests.cs @@ -12,7 +12,7 @@ namespace Orchard.Tests.Tasks { public class SweepGeneratorTests : ContainerTestBase { protected override void Register(ContainerBuilder builder) { builder.RegisterAutoMocking(MockBehavior.Loose); - builder.RegisterType().As(); + builder.RegisterType().As(); builder.RegisterType(); } diff --git a/src/Orchard.Tests/UI/ShapeTests.cs b/src/Orchard.Tests/UI/ShapeTests.cs index f5d8fb4c0..efac540ea 100644 --- a/src/Orchard.Tests/UI/ShapeTests.cs +++ b/src/Orchard.Tests/UI/ShapeTests.cs @@ -19,7 +19,7 @@ namespace Orchard.Tests.UI { protected override void Register(ContainerBuilder builder) { builder.RegisterType().As(); - builder.RegisterType().As(); + builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); diff --git a/src/Orchard.Web/Modules/Orchard.Setup/SetupMode.cs b/src/Orchard.Web/Modules/Orchard.Setup/SetupMode.cs index bd77e21af..f7f185abb 100644 --- a/src/Orchard.Web/Modules/Orchard.Setup/SetupMode.cs +++ b/src/Orchard.Web/Modules/Orchard.Setup/SetupMode.cs @@ -45,6 +45,8 @@ namespace Orchard.Setup { // standard services needed in setup mode builder.RegisterModule(new MvcModule()); builder.RegisterModule(new CommandModule()); + builder.RegisterModule(new WorkContextModule()); + builder.RegisterType().As().InstancePerLifetimeScope(); builder.RegisterType().As().InstancePerLifetimeScope(); builder.RegisterType().As().As().InstancePerLifetimeScope(); @@ -58,7 +60,7 @@ namespace Orchard.Setup { builder.RegisterType().As().InstancePerLifetimeScope(); builder.RegisterType().As().InstancePerLifetimeScope(); builder.RegisterType().As().InstancePerLifetimeScope(); - builder.RegisterType().As().InstancePerMatchingLifetimeScope("shell"); + builder.RegisterType().As().InstancePerMatchingLifetimeScope("shell"); builder.RegisterType().As().InstancePerLifetimeScope(); builder.RegisterType().As().InstancePerLifetimeScope(); builder.RegisterType().As().InstancePerLifetimeScope(); diff --git a/src/Orchard/Environment/DefaultWorkContextAccessor.cs b/src/Orchard/Environment/WorkContextAccessor.cs similarity index 60% rename from src/Orchard/Environment/DefaultWorkContextAccessor.cs rename to src/Orchard/Environment/WorkContextAccessor.cs index 9a2c6816f..307ed2dd2 100644 --- a/src/Orchard/Environment/DefaultWorkContextAccessor.cs +++ b/src/Orchard/Environment/WorkContextAccessor.cs @@ -1,13 +1,11 @@ using System; using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; using System.Web; using Autofac; using Orchard.Mvc; namespace Orchard.Environment { - public class DefaultWorkContextAccessor : IWorkContextAccessor { + public class WorkContextAccessor : IWorkContextAccessor { readonly ILifetimeScope _lifetimeScope; readonly IHttpContextAccessor _httpContextAccessor; @@ -18,7 +16,7 @@ namespace Orchard.Environment { [ThreadStatic] static ConcurrentDictionary _threadStaticContexts; - public DefaultWorkContextAccessor( + public WorkContextAccessor( IHttpContextAccessor httpContextAccessor, ILifetimeScope lifetimeScope) { _httpContextAccessor = httpContextAccessor; @@ -39,36 +37,23 @@ namespace Orchard.Environment { } public IWorkContextScope CreateWorkContextScope(HttpContextBase httpContext) { + var workLifetime = _lifetimeScope.BeginLifetimeScope("work"); + workLifetime.Resolve>().Value = httpContext; - var workLifetime = SpawnWorkLifetime(builder => { - builder.Register(ctx => httpContext) - .As(); - - builder.Register(ctx => new WorkContextImplementation(ctx)) - .As() - .InstancePerMatchingLifetimeScope("work"); - }); return new HttpContextScopeImplementation( workLifetime, httpContext, _workContextKey); } + public IWorkContextScope CreateWorkContextScope() { var httpContext = _httpContextAccessor.Current(); if (httpContext != null) return CreateWorkContextScope(httpContext); - var workLifetime = SpawnWorkLifetime(builder => { - builder.Register(ctx => httpContext) - .As(); - - builder.Register(ctx => new WorkContextImplementation(ctx)) - .As() - .InstancePerMatchingLifetimeScope("work"); - }); return new ThreadStaticScopeImplementation( - workLifetime, + _lifetimeScope.BeginLifetimeScope("work"), EnsureThreadStaticContexts(), _workContextKey); } @@ -77,49 +62,6 @@ namespace Orchard.Environment { return _threadStaticContexts ?? (_threadStaticContexts = new ConcurrentDictionary()); } - private ILifetimeScope SpawnWorkLifetime(Action configurationAction) { - return _lifetimeScope.BeginLifetimeScope("work", configurationAction); - } - - class WorkContextImplementation : WorkContext { - readonly IComponentContext _componentContext; - readonly ConcurrentDictionary> _stateResolvers = new ConcurrentDictionary>(); - readonly IEnumerable _workContextStateProviders; - - public WorkContextImplementation(IComponentContext componentContext) { - _componentContext = componentContext; - _workContextStateProviders = componentContext.Resolve>(); - } - - public override T Resolve() { - return _componentContext.Resolve(); - } - - public override bool TryResolve(out T service) { - return _componentContext.TryResolve(out service); - } - - public override T GetState(string name) { - var resolver = _stateResolvers.GetOrAdd(name, FindResolverForState); - return (T)resolver(); - } - - Func FindResolverForState(string name) { - var resolver = _workContextStateProviders.Select(wcsp => wcsp.Get(name)) - .FirstOrDefault(value => !Equals(value, default(T))); - - if (resolver == null) { - return () => default(T); - } - return () => resolver(this); - } - - - public override void SetState(string name, T value) { - _stateResolvers[name] = () => value; - } - } - class HttpContextScopeImplementation : IWorkContextScope { readonly WorkContext _workContext; diff --git a/src/Orchard/Environment/WorkContextImplementation.cs b/src/Orchard/Environment/WorkContextImplementation.cs new file mode 100644 index 000000000..e7f0634b2 --- /dev/null +++ b/src/Orchard/Environment/WorkContextImplementation.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using Autofac; + +namespace Orchard.Environment { + class WorkContextImplementation : WorkContext { + readonly IComponentContext _componentContext; + readonly ConcurrentDictionary> _stateResolvers = new ConcurrentDictionary>(); + readonly IEnumerable _workContextStateProviders; + + public WorkContextImplementation(IComponentContext componentContext) { + _componentContext = componentContext; + _workContextStateProviders = componentContext.Resolve>(); + } + + public override T Resolve() { + return _componentContext.Resolve(); + } + + public override bool TryResolve(out T service) { + return _componentContext.TryResolve(out service); + } + + public override T GetState(string name) { + var resolver = _stateResolvers.GetOrAdd(name, FindResolverForState); + return (T)resolver(); + } + + Func FindResolverForState(string name) { + var resolver = Enumerable.FirstOrDefault(_workContextStateProviders.Select(wcsp => wcsp.Get(name)), value => !Equals(value, default(T))); + + if (resolver == null) { + return () => default(T); + } + return () => resolver(this); + } + + + public override void SetState(string name, T value) { + _stateResolvers[name] = () => value; + } + } +} \ No newline at end of file diff --git a/src/Orchard/Environment/WorkContextModule.cs b/src/Orchard/Environment/WorkContextModule.cs new file mode 100644 index 000000000..49729cda2 --- /dev/null +++ b/src/Orchard/Environment/WorkContextModule.cs @@ -0,0 +1,24 @@ +using System.Web; +using Autofac; + +namespace Orchard.Environment { + public class WorkContextModule : Module { + protected override void Load(ContainerBuilder builder) { + builder.RegisterType() + .As() + .InstancePerMatchingLifetimeScope("shell"); + + builder.Register(ctx => new WorkContextImplementation(ctx)) + .As() + .InstancePerMatchingLifetimeScope("work"); + + builder.RegisterType>() + .As>() + .InstancePerMatchingLifetimeScope("work"); + + builder.Register(ctx => ctx.Resolve>().Value) + .As() + .InstancePerDependency(); + } + } +} diff --git a/src/Orchard/Environment/WorkContextProperty.cs b/src/Orchard/Environment/WorkContextProperty.cs new file mode 100644 index 000000000..8dd6223d0 --- /dev/null +++ b/src/Orchard/Environment/WorkContextProperty.cs @@ -0,0 +1,5 @@ +namespace Orchard.Environment { + class WorkContextProperty { + public T Value { get; set; } + } +} \ No newline at end of file diff --git a/src/Orchard/IWorkContextAccessor.cs b/src/Orchard/IWorkContextAccessor.cs index 585b630a4..1f6fec307 100644 --- a/src/Orchard/IWorkContextAccessor.cs +++ b/src/Orchard/IWorkContextAccessor.cs @@ -2,7 +2,7 @@ using System.Web; namespace Orchard { - public interface IWorkContextAccessor : ISingletonDependency { + public interface IWorkContextAccessor { WorkContext GetContext(HttpContextBase httpContext); IWorkContextScope CreateWorkContextScope(HttpContextBase httpContext); diff --git a/src/Orchard/Orchard.Framework.csproj b/src/Orchard/Orchard.Framework.csproj index a264d31e6..b54a863e2 100644 --- a/src/Orchard/Orchard.Framework.csproj +++ b/src/Orchard/Orchard.Framework.csproj @@ -158,6 +158,9 @@ + + + @@ -419,7 +422,7 @@ - + From c89aeb635c6ba04cde453f3b6360fd07791fe275 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 24 Nov 2010 20:51:35 -0800 Subject: [PATCH 04/11] Inverting Lazy and Meta to avoid instantiating controller to get it's type --HG-- branch : perf --- src/Orchard/Mvc/OrchardControllerFactory.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Orchard/Mvc/OrchardControllerFactory.cs b/src/Orchard/Mvc/OrchardControllerFactory.cs index f4596c66b..c66ab2d7e 100644 --- a/src/Orchard/Mvc/OrchardControllerFactory.cs +++ b/src/Orchard/Mvc/OrchardControllerFactory.cs @@ -36,10 +36,10 @@ namespace Orchard.Mvc { var serviceKey = (areaName + "/" + controllerName).ToLowerInvariant(); // Now that the request container is known - try to resolve the controller information - Lazy> info; + Meta> info; var workContext = requestContext.GetWorkContext(); if (TryResolve(workContext, serviceKey, out info)) { - return (Type) info.Value.Metadata["ControllerType"]; + return (Type) info.Metadata["ControllerType"]; } return null; From 632f94f3d7aea4b22c9969dbec30b74bb1a352f1 Mon Sep 17 00:00:00 2001 From: Suha Can Date: Mon, 29 Nov 2010 11:03:14 -0800 Subject: [PATCH 05/11] Setting trust level back to Full in branch. --HG-- branch : perf --- src/Orchard.Web/Web.config | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Orchard.Web/Web.config b/src/Orchard.Web/Web.config index 9b51854ad..3613a7321 100644 --- a/src/Orchard.Web/Web.config +++ b/src/Orchard.Web/Web.config @@ -40,8 +40,6 @@ - -