diff --git a/src/Umbraco.Core/DependencyInjection/ServicesCompositionRoot.cs b/src/Umbraco.Core/DependencyInjection/ServicesCompositionRoot.cs index 0326072447..4f74797f45 100644 --- a/src/Umbraco.Core/DependencyInjection/ServicesCompositionRoot.cs +++ b/src/Umbraco.Core/DependencyInjection/ServicesCompositionRoot.cs @@ -21,8 +21,9 @@ namespace Umbraco.Core.DependencyInjection { container.RegisterSingleton(); - //These will be replaced by the web boot manager when running in a web context - container.Register(); + // register a transient messages factory, which will be replaced byt the web + // boot manager when running in a web context + container.Register(); //the context container.RegisterSingleton(); diff --git a/src/Umbraco.Core/Events/IEventMessagesFactory.cs b/src/Umbraco.Core/Events/IEventMessagesFactory.cs index cb2391186d..992220ab87 100644 --- a/src/Umbraco.Core/Events/IEventMessagesFactory.cs +++ b/src/Umbraco.Core/Events/IEventMessagesFactory.cs @@ -8,5 +8,7 @@ namespace Umbraco.Core.Events public interface IEventMessagesFactory { EventMessages Get(); + + EventMessages GetOrDefault(); } } \ No newline at end of file diff --git a/src/Umbraco.Core/Events/TransientMessagesFactory.cs b/src/Umbraco.Core/Events/TransientEventMessagesFactory.cs similarity index 58% rename from src/Umbraco.Core/Events/TransientMessagesFactory.cs rename to src/Umbraco.Core/Events/TransientEventMessagesFactory.cs index 5cd291a37f..880332ac40 100644 --- a/src/Umbraco.Core/Events/TransientMessagesFactory.cs +++ b/src/Umbraco.Core/Events/TransientEventMessagesFactory.cs @@ -3,11 +3,16 @@ namespace Umbraco.Core.Events /// /// A simple/default transient messages factory /// - internal class TransientMessagesFactory : IEventMessagesFactory + internal class TransientEventMessagesFactory : IEventMessagesFactory { public EventMessages Get() { return new EventMessages(); } + + public EventMessages GetOrDefault() + { + return null; + } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 0533a7c82c..46f109731d 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -319,7 +319,7 @@ - + diff --git a/src/Umbraco.Tests/Services/ThreadSafetyServiceTest.cs b/src/Umbraco.Tests/Services/ThreadSafetyServiceTest.cs index d1e96850b3..7c26e6924c 100644 --- a/src/Umbraco.Tests/Services/ThreadSafetyServiceTest.cs +++ b/src/Umbraco.Tests/Services/ThreadSafetyServiceTest.cs @@ -54,7 +54,7 @@ namespace Umbraco.Tests.Services //here we are going to override the ServiceContext because normally with our test cases we use a //global Database object but this is NOT how it should work in the web world or in any multi threaded scenario. //we need a new Database object for each thread. - var evtMsgs = new TransientMessagesFactory(); + var evtMsgs = new TransientEventMessagesFactory(); ApplicationContext.Services = TestObjects.GetServiceContext( repositoryFactory, _uowProvider, diff --git a/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs b/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs index 72008524a2..bc7d2e3ff4 100644 --- a/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs +++ b/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs @@ -113,7 +113,7 @@ namespace Umbraco.Tests.TestHelpers // but, that will NOT prevent _appContext from NOT being configured, because it cannot connect // to the database to check the migrations ;-( - var evtMsgs = new TransientMessagesFactory(); + var evtMsgs = new TransientEventMessagesFactory(); var databaseContext = new DatabaseContext(databaseFactory, Logger); var repositoryFactory = Container.GetInstance(); var serviceContext = TestObjects.GetServiceContext( diff --git a/src/Umbraco.Tests/TestHelpers/BaseUmbracoApplicationTest.cs b/src/Umbraco.Tests/TestHelpers/BaseUmbracoApplicationTest.cs index b88f5d4612..2c333c0a2c 100644 --- a/src/Umbraco.Tests/TestHelpers/BaseUmbracoApplicationTest.cs +++ b/src/Umbraco.Tests/TestHelpers/BaseUmbracoApplicationTest.cs @@ -215,7 +215,7 @@ namespace Umbraco.Tests.TestHelpers /// protected virtual void SetupApplicationContext() { - var evtMsgs = new TransientMessagesFactory(); + var evtMsgs = new TransientEventMessagesFactory(); ApplicationContext.Current = new ApplicationContext( //assign the db context new DatabaseContext(new DefaultDatabaseFactory( diff --git a/src/Umbraco.Web/DefaultHttpContextAccessor.cs b/src/Umbraco.Web/DefaultHttpContextAccessor.cs deleted file mode 100644 index 121c90e1af..0000000000 --- a/src/Umbraco.Web/DefaultHttpContextAccessor.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.Web; - -namespace Umbraco.Web -{ - internal class DefaultHttpContextAccessor : IHttpContextAccessor - { - private readonly Func _httpContext; - - public DefaultHttpContextAccessor(Func httpContext) - { - _httpContext = httpContext; - } - - public HttpContextBase Value - { - get { return _httpContext(); } - } - } -} \ No newline at end of file diff --git a/src/Umbraco.Web/IHttpContextAccessor.cs b/src/Umbraco.Web/IHttpContextAccessor.cs deleted file mode 100644 index 068783725a..0000000000 --- a/src/Umbraco.Web/IHttpContextAccessor.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Web; - -namespace Umbraco.Web -{ - /// - /// Used to retrieve the HttpContext - /// - /// - /// NOTE: This has a singleton lifespan - /// - public interface IHttpContextAccessor - { - HttpContextBase Value { get; } - } -} \ No newline at end of file diff --git a/src/Umbraco.Web/RequestLifespanMessagesFactory.cs b/src/Umbraco.Web/RequestLifespanMessagesFactory.cs deleted file mode 100644 index 26ac3bd5df..0000000000 --- a/src/Umbraco.Web/RequestLifespanMessagesFactory.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; -using Umbraco.Core.Events; - -namespace Umbraco.Web -{ - /// - /// Stores the instance of EventMessages in the current request so all events will share the same instance - /// - internal class RequestLifespanMessagesFactory : IEventMessagesFactory - { - private readonly IHttpContextAccessor _httpAccessor; - - public RequestLifespanMessagesFactory(IHttpContextAccessor httpAccessor) - { - if (httpAccessor == null) throw new ArgumentNullException("httpAccessor"); - _httpAccessor = httpAccessor; - } - - public EventMessages Get() - { - if (_httpAccessor.Value.Items[typeof (RequestLifespanMessagesFactory).Name] == null) - { - _httpAccessor.Value.Items[typeof(RequestLifespanMessagesFactory).Name] = new EventMessages(); - } - return (EventMessages)_httpAccessor.Value.Items[typeof (RequestLifespanMessagesFactory).Name]; - } - } -} \ No newline at end of file diff --git a/src/Umbraco.Web/ScopeContextEventMessagesFactory.cs b/src/Umbraco.Web/ScopeContextEventMessagesFactory.cs new file mode 100644 index 0000000000..66ee150b55 --- /dev/null +++ b/src/Umbraco.Web/ScopeContextEventMessagesFactory.cs @@ -0,0 +1,34 @@ +using System; +using Umbraco.Core; +using Umbraco.Core.Events; + +namespace Umbraco.Web +{ + /// + /// Stores the instance of EventMessages in the current scope context so all events will share the same instance. + /// + internal class ScopeContextEventMessagesFactory : IEventMessagesFactory + { + private readonly IScopeContextAdapter _scopeContextAdapter; + private const string ContextKey = nameof(ScopeContextEventMessagesFactory); + + public ScopeContextEventMessagesFactory(IScopeContextAdapter scopeContextAdapter) + { + if (scopeContextAdapter == null) throw new ArgumentNullException(nameof(scopeContextAdapter)); + _scopeContextAdapter = scopeContextAdapter; + } + + public EventMessages Get() + { + var evtMsgs = (EventMessages) _scopeContextAdapter.Get(ContextKey); + if (evtMsgs == null) + _scopeContextAdapter.Set(ContextKey, evtMsgs = new EventMessages()); + return evtMsgs; + } + + public EventMessages GetOrDefault() + { + return (EventMessages) _scopeContextAdapter.Get(ContextKey); + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Web/SingletonHttpContextAccessor.cs b/src/Umbraco.Web/SingletonHttpContextAccessor.cs deleted file mode 100644 index cdeafa48e1..0000000000 --- a/src/Umbraco.Web/SingletonHttpContextAccessor.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.Web; - -namespace Umbraco.Web -{ - internal class SingletonHttpContextAccessor : IHttpContextAccessor - { - public HttpContextBase Value - { - get { return new HttpContextWrapper(HttpContext.Current); } - } - } -} \ No newline at end of file diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index c8a70ba6e2..41c9338134 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -323,14 +323,12 @@ - - @@ -418,7 +416,7 @@ - + @@ -435,7 +433,6 @@ - diff --git a/src/Umbraco.Web/Umbraco.Web.csproj.DotSettings b/src/Umbraco.Web/Umbraco.Web.csproj.DotSettings index 662f95686e..73e96563f9 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj.DotSettings +++ b/src/Umbraco.Web/Umbraco.Web.csproj.DotSettings @@ -1,2 +1,2 @@  - CSharp50 \ No newline at end of file + CSharp60 \ No newline at end of file diff --git a/src/Umbraco.Web/UmbracoContextExtensions.cs b/src/Umbraco.Web/UmbracoContextExtensions.cs index 8cd38df6d1..42d8a5cfde 100644 --- a/src/Umbraco.Web/UmbracoContextExtensions.cs +++ b/src/Umbraco.Web/UmbracoContextExtensions.cs @@ -13,6 +13,9 @@ namespace Umbraco.Web /// public static class UmbracoContextExtensions { + // fixme - this class is generally ugly now that we have proper IoC + // the current umbraco context belongs to the ScopeContext not the HttpContext + /// /// tries to get the Umbraco context from the HttpContext /// @@ -53,10 +56,11 @@ namespace Umbraco.Web /// public static EventMessages GetCurrentEventMessages(this UmbracoContext umbracoContext) { - var msgs = umbracoContext.HttpContext.Items[typeof (RequestLifespanMessagesFactory).Name]; - if (msgs == null) return null; - return (EventMessages) msgs; + // fixme - this is ugly + // the event messages factory should be injected / supplied by the container to whoever needs it! + var scopeContextAdapter = new DefaultScopeContextAdapter(); + var eventMessagesFactory = new ScopeContextEventMessagesFactory(scopeContextAdapter); + return eventMessagesFactory.GetOrDefault(); } - } } diff --git a/src/Umbraco.Web/WebBootManager.cs b/src/Umbraco.Web/WebBootManager.cs index 545d7d7e24..1486d77774 100644 --- a/src/Umbraco.Web/WebBootManager.cs +++ b/src/Umbraco.Web/WebBootManager.cs @@ -338,7 +338,6 @@ namespace Umbraco.Web //no need to declare as per request, it's lifetime is already managed as a singleton container.Register(factory => new HttpContextWrapper(HttpContext.Current)); - container.RegisterSingleton(); container.RegisterSingleton(); container.RegisterSingleton(factory => new PublishedContentCache()); container.RegisterSingleton(); @@ -348,7 +347,7 @@ namespace Umbraco.Web container.RegisterSingleton(); //Replace services: - container.Register(); + container.Register(); container.RegisterSingleton(); container.RegisterSingleton(); }