diff --git a/src/Orchard.Web/Modules/Orchard.Setup/SetupMode.cs b/src/Orchard.Web/Modules/Orchard.Setup/SetupMode.cs index 0395a666f..d56bd633c 100644 --- a/src/Orchard.Web/Modules/Orchard.Setup/SetupMode.cs +++ b/src/Orchard.Web/Modules/Orchard.Setup/SetupMode.cs @@ -139,10 +139,12 @@ namespace Orchard.Setup { [UsedImplicitly] class SafeModeSiteWorkContextProvider : IWorkContextStateProvider { - public T Get(string name) { - if (name == "CurrentSite") - return (T)(ISite) new SafeModeSite(); - return default(T); + public Func Get(string name) { + if (name == "CurrentSite") { + ISite safeModeSite = new SafeModeSite(); + return () => (T)safeModeSite; + } + return null; } } diff --git a/src/Orchard/Environment/DefaultWorkContextAccessor.cs b/src/Orchard/Environment/DefaultWorkContextAccessor.cs index a507cfcdd..abfa1e85e 100644 --- a/src/Orchard/Environment/DefaultWorkContextAccessor.cs +++ b/src/Orchard/Environment/DefaultWorkContextAccessor.cs @@ -97,10 +97,10 @@ namespace Orchard.Environment { } public override T GetState(string name) { - return (T)_state.GetOrAdd(name, x => GetStateInternal(x)); + return (T)_state.GetOrAdd(name, s => GetStateInternal(s) == null ? default(T) : GetStateInternal(s).Invoke()); } - private T GetStateInternal(string name) { + private Func GetStateInternal(string name) { return _workContextStateProviders.Select(wcsp => wcsp.Get(name)) .FirstOrDefault(value => !Equals(value, default(T))); } diff --git a/src/Orchard/IWorkContextAccessor.cs b/src/Orchard/IWorkContextAccessor.cs index 7fddb2406..523bfd01e 100644 --- a/src/Orchard/IWorkContextAccessor.cs +++ b/src/Orchard/IWorkContextAccessor.cs @@ -11,7 +11,7 @@ namespace Orchard { } public interface IWorkContextStateProvider : IDependency { - T Get(string name); + Func Get(string name); } public interface IWorkContextScope : IDisposable { diff --git a/src/Orchard/Security/CurrentUserWorkContext.cs b/src/Orchard/Security/CurrentUserWorkContext.cs index d3359cf49..7b874d2a4 100644 --- a/src/Orchard/Security/CurrentUserWorkContext.cs +++ b/src/Orchard/Security/CurrentUserWorkContext.cs @@ -1,4 +1,6 @@ -namespace Orchard.Security { +using System; + +namespace Orchard.Security { public class CurrentUserWorkContext : IWorkContextStateProvider { private readonly IAuthenticationService _authenticationService; @@ -6,10 +8,10 @@ _authenticationService = authenticationService; } - public T Get(string name) { - if (name == "CurrentUser") - return (T)_authenticationService.GetAuthenticatedUser(); - return default(T); + public Func Get(string name) { + if (name == "CurrentUser") + return () => (T)_authenticationService.GetAuthenticatedUser(); + return null; } } } diff --git a/src/Orchard/Settings/CurrentSiteWorkContext.cs b/src/Orchard/Settings/CurrentSiteWorkContext.cs index 1d7c9c2e3..f5e2c8f56 100644 --- a/src/Orchard/Settings/CurrentSiteWorkContext.cs +++ b/src/Orchard/Settings/CurrentSiteWorkContext.cs @@ -1,4 +1,6 @@ -namespace Orchard.Settings { +using System; + +namespace Orchard.Settings { public class CurrentSiteWorkContext : IWorkContextStateProvider { private readonly ISiteService _siteService; @@ -6,10 +8,12 @@ _siteService = siteService; } - public T Get(string name) { - if (name == "CurrentSite") - return (T)_siteService.GetSiteSettings(); - return default(T); + public Func Get(string name) { + if (name == "CurrentSite") { + var siteSettings = _siteService.GetSiteSettings(); + return () => (T)siteSettings; + } + return null; } } } diff --git a/src/Orchard/UI/Zones/LayoutWorkContext.cs b/src/Orchard/UI/Zones/LayoutWorkContext.cs index 977799bbe..c66d08cd6 100644 --- a/src/Orchard/UI/Zones/LayoutWorkContext.cs +++ b/src/Orchard/UI/Zones/LayoutWorkContext.cs @@ -1,4 +1,5 @@ -using ClaySharp.Implementation; +using System; +using ClaySharp.Implementation; using Orchard.DisplayManagement; namespace Orchard.UI.Zones { @@ -9,11 +10,12 @@ namespace Orchard.UI.Zones { _shapeFactory = shapeFactory; } - public T Get(string name) { + public Func Get(string name) { if (name == "Layout") { - return (dynamic)_shapeFactory.Create("Layout", Arguments.Empty()); + var layout = _shapeFactory.Create("Layout", Arguments.Empty()); + return () => (T)layout; } - return default(T); + return null; } } }