Files
Umbraco-CMS/src/Umbraco.Web/UmbracoContextFactory.cs

91 lines
4.7 KiB
C#
Raw Normal View History

2021-01-07 22:05:23 +11:00
using System;
2019-02-14 12:51:46 +01:00
using System.IO;
using System.Text;
using Umbraco.Core.Configuration;
2020-09-08 13:03:43 +02:00
using Umbraco.Core.Configuration.Models;
using Umbraco.Core.Hosting;
2019-02-14 12:51:46 +01:00
using Umbraco.Core.Models.PublishedContent;
using Umbraco.Core.Services;
using Umbraco.Web.PublishedCache;
using Umbraco.Web.Security;
namespace Umbraco.Web
{
2021-01-07 22:05:23 +11:00
// NOTE: This has been migrated to netcore
2019-02-14 12:51:46 +01:00
/// <summary>
2020-02-09 18:53:37 +01:00
/// Creates and manages <see cref="IUmbracoContext"/> instances.
2019-02-14 12:51:46 +01:00
/// </summary>
public class UmbracoContextFactory : IUmbracoContextFactory
{
private readonly IUmbracoContextAccessor _umbracoContextAccessor;
private readonly IPublishedSnapshotService _publishedSnapshotService;
private readonly IVariationContextAccessor _variationContextAccessor;
private readonly IDefaultCultureAccessor _defaultCultureAccessor;
2020-09-08 13:03:43 +02:00
private readonly GlobalSettings _globalSettings;
2019-02-14 12:51:46 +01:00
private readonly IUserService _userService;
private readonly IHostingEnvironment _hostingEnvironment;
2020-02-13 12:29:08 +01:00
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly ICookieManager _cookieManager;
private readonly UriUtility _uriUtility;
2019-02-14 12:51:46 +01:00
/// <summary>
/// Initializes a new instance of the <see cref="UmbracoContextFactory"/> class.
/// </summary>
public UmbracoContextFactory(
IUmbracoContextAccessor umbracoContextAccessor,
IPublishedSnapshotService publishedSnapshotService,
IVariationContextAccessor variationContextAccessor,
IDefaultCultureAccessor defaultCultureAccessor,
2020-09-08 13:03:43 +02:00
GlobalSettings globalSettings,
IUserService userService,
IHostingEnvironment hostingEnvironment,
Merge remote-tracking branch 'origin/netcore/dev' into netcore/feature/move-files-after-umbraco-context-abstractions # Conflicts: # src/Umbraco.Abstractions/PublishedContentExtensions.cs # src/Umbraco.Abstractions/Routing/AliasUrlProvider.cs # src/Umbraco.Abstractions/Routing/DefaultMediaUrlProvider.cs # src/Umbraco.Abstractions/Routing/DefaultUrlProvider.cs # src/Umbraco.Abstractions/Routing/UrlProvider.cs # src/Umbraco.Abstractions/Routing/UrlProviderExtensions.cs # src/Umbraco.Infrastructure/Runtime/CoreInitialComposer.cs # src/Umbraco.Tests/Cache/DistributedCacheBinderTests.cs # src/Umbraco.Tests/Routing/GetContentUrlsTests.cs # src/Umbraco.Tests/Routing/MediaUrlProviderTests.cs # src/Umbraco.Tests/Routing/UmbracoModuleTests.cs # src/Umbraco.Tests/Routing/UrlProviderTests.cs # src/Umbraco.Tests/Routing/UrlsProviderWithDomainsTests.cs # src/Umbraco.Tests/Routing/UrlsWithNestedDomains.cs # src/Umbraco.Tests/Security/BackOfficeCookieManagerTests.cs # src/Umbraco.Tests/TestHelpers/TestHelper.cs # src/Umbraco.Tests/TestHelpers/TestObjects-Mocks.cs # src/Umbraco.Tests/Testing/Objects/TestUmbracoContextFactory.cs # src/Umbraco.Tests/Testing/UmbracoTestBase.cs # src/Umbraco.Tests/Web/Mvc/RenderIndexActionSelectorAttributeTests.cs # src/Umbraco.Tests/Web/Mvc/SurfaceControllerTests.cs # src/Umbraco.Web/Models/Mapping/ContentMapDefinition.cs # src/Umbraco.Web/PublishedContentExtensions.cs # src/Umbraco.Web/UmbracoContext.cs # src/Umbraco.Web/UmbracoContextFactory.cs # src/Umbraco.Web/UmbracoInjectedModule.cs
2020-02-17 12:45:37 +01:00
UriUtility uriUtility,
IHttpContextAccessor httpContextAccessor,
ICookieManager cookieManager)
2019-02-14 12:51:46 +01:00
{
_umbracoContextAccessor = umbracoContextAccessor ?? throw new ArgumentNullException(nameof(umbracoContextAccessor));
_publishedSnapshotService = publishedSnapshotService ?? throw new ArgumentNullException(nameof(publishedSnapshotService));
_variationContextAccessor = variationContextAccessor ?? throw new ArgumentNullException(nameof(variationContextAccessor));
_defaultCultureAccessor = defaultCultureAccessor ?? throw new ArgumentNullException(nameof(defaultCultureAccessor));
_globalSettings = globalSettings ?? throw new ArgumentNullException(nameof(globalSettings));
2019-02-14 12:51:46 +01:00
_userService = userService ?? throw new ArgumentNullException(nameof(userService));
_hostingEnvironment = hostingEnvironment;
_uriUtility = uriUtility;
2020-02-13 12:29:08 +01:00
_httpContextAccessor = httpContextAccessor;
_cookieManager = cookieManager;
2019-02-14 12:51:46 +01:00
}
private IUmbracoContext CreateUmbracoContext()
2019-02-14 12:51:46 +01:00
{
// make sure we have a variation context
if (_variationContextAccessor.VariationContext == null)
2019-07-12 13:15:41 +10:00
{
// TODO: By using _defaultCultureAccessor.DefaultCulture this means that the VariationContext will always return a variant culture, it will never
// return an empty string signifying that the culture is invariant. But does this matter? Are we actually expecting this to return an empty string
// for invariant routes? From what i can tell throughout the codebase is that whenever we are checking against the VariationContext.Culture we are
// also checking if the content type varies by culture or not. This is fine, however the code in the ctor of VariationContext is then misleading
// since it's assuming that the Culture can be empty (invariant) when in reality of a website this will never be empty since a real culture is always set here.
2019-02-14 12:51:46 +01:00
_variationContextAccessor.VariationContext = new VariationContext(_defaultCultureAccessor.DefaultCulture);
2019-07-12 13:15:41 +10:00
}
2019-11-20 15:21:09 +01:00
return new UmbracoContext(_httpContextAccessor, _publishedSnapshotService, new BackOfficeSecurity(), _globalSettings, _hostingEnvironment, _variationContextAccessor, _uriUtility, _cookieManager);
2019-02-14 12:51:46 +01:00
}
/// <inheritdoc />
public UmbracoContextReference EnsureUmbracoContext()
2019-02-14 12:51:46 +01:00
{
var currentUmbracoContext = _umbracoContextAccessor.UmbracoContext;
if (currentUmbracoContext != null)
return new UmbracoContextReference(currentUmbracoContext, false, _umbracoContextAccessor);
2019-02-14 12:51:46 +01:00
var umbracoContext = CreateUmbracoContext();
2019-02-14 12:51:46 +01:00
_umbracoContextAccessor.UmbracoContext = umbracoContext;
return new UmbracoContextReference(umbracoContext, true, _umbracoContextAccessor);
2019-02-14 12:51:46 +01:00
}
}
}