diff --git a/src/Umbraco.Core/Composing/Composers/ConfigurationComposer.cs b/src/Umbraco.Core/Composing/Composers/ConfigurationComposer.cs new file mode 100644 index 0000000000..e2ba477045 --- /dev/null +++ b/src/Umbraco.Core/Composing/Composers/ConfigurationComposer.cs @@ -0,0 +1,25 @@ +using LightInject; +using Umbraco.Core.Configuration; +using Umbraco.Core.Configuration.UmbracoSettings; + +namespace Umbraco.Core.Composing.Composers +{ + /// + /// Sets up IoC container for Umbraco configuration classes + /// + public static class ConfigurationComposer + { + public static IServiceRegistry ComposeConfiguration(this IServiceRegistry registry) + { + registry.Register(factory => UmbracoConfig.For.UmbracoSettings()); + registry.Register(factory => factory.GetInstance().Content); + registry.Register(factory => factory.GetInstance().Templates); + registry.Register(factory => factory.GetInstance().RequestHandler); + registry.Register(factory => UmbracoConfig.For.GlobalSettings()); + + // fixme - other sections we need to add? + + return registry; + } + } +} diff --git a/src/Umbraco.Core/Composing/Composers/CoreMappingProfilesComposer.cs b/src/Umbraco.Core/Composing/Composers/CoreMappingProfilesComposer.cs new file mode 100644 index 0000000000..ce9f507b9f --- /dev/null +++ b/src/Umbraco.Core/Composing/Composers/CoreMappingProfilesComposer.cs @@ -0,0 +1,15 @@ +using LightInject; +using Umbraco.Core.Models.Identity; + +namespace Umbraco.Core.Composing.Composers + +{ + public static class CoreMappingProfilesComposer + { + public static IServiceRegistry ComposeCoreMappingProfiles(this IServiceRegistry registry) + { + registry.Register(); + return registry; + } + } +} diff --git a/src/Umbraco.Core/Composing/Composers/FileSystemsComposer.cs b/src/Umbraco.Core/Composing/Composers/FileSystemsComposer.cs new file mode 100644 index 0000000000..c7ed93680b --- /dev/null +++ b/src/Umbraco.Core/Composing/Composers/FileSystemsComposer.cs @@ -0,0 +1,28 @@ +using LightInject; +using Umbraco.Core.Configuration.UmbracoSettings; +using Umbraco.Core.IO; +using Umbraco.Core.Logging; + +namespace Umbraco.Core.Composing.Composers +{ + public static class FileSystemsComposer + { + public static IServiceRegistry ComposeFileSystems(this IServiceRegistry registry) + { + // register FileSystems, which manages all filesystems + registry.RegisterSingleton(); + + // register IFileSystems, which gives access too all filesystems + registry.RegisterSingleton(factory => factory.GetInstance()); + + // register MediaFileSystem, which can be injected directly + registry.RegisterSingleton(factory => factory.GetInstance().MediaFileSystem); + + // register MediaFileSystem, so that FileSystems can create it + registry.Register((f, wrappedFileSystem) + => new MediaFileSystem(wrappedFileSystem, f.GetInstance(), f.GetInstance(), f.GetInstance())); + + return registry; + } + } +} diff --git a/src/Umbraco.Core/Composing/Composers/RepositoriesComposer.cs b/src/Umbraco.Core/Composing/Composers/RepositoriesComposer.cs new file mode 100644 index 0000000000..79b2b9c223 --- /dev/null +++ b/src/Umbraco.Core/Composing/Composers/RepositoriesComposer.cs @@ -0,0 +1,56 @@ +using LightInject; +using Umbraco.Core.Persistence.Repositories; +using Umbraco.Core.Persistence.Repositories.Implement; + +namespace Umbraco.Core.Composing.Composers +{ + /// + /// Composes repositories. + /// + public static class RepositoriesComposer + { + public static IServiceRegistry ComposeRepositories(this IServiceRegistry registry) + { + // repositories + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + + return registry; + } + } +} diff --git a/src/Umbraco.Core/Composing/Composers/ServicesComposer.cs b/src/Umbraco.Core/Composing/Composers/ServicesComposer.cs new file mode 100644 index 0000000000..c774912f2e --- /dev/null +++ b/src/Umbraco.Core/Composing/Composers/ServicesComposer.cs @@ -0,0 +1,95 @@ +using System; +using System.IO; +using System.Linq; +using LightInject; +using Umbraco.Core.Cache; +using Umbraco.Core.Events; +using Umbraco.Core.IO; +using Umbraco.Core.Logging; +using Umbraco.Core.Services; +using Umbraco.Core.Services.Implement; + +namespace Umbraco.Core.Composing.Composers +{ + public static class ServicesComposer + { + public static IServiceRegistry ComposeServices(this IServiceRegistry registry) + { + // register a transient messages factory, which will be replaced by the web + // boot manager when running in a web context + registry.RegisterSingleton(); + + // register the service context + registry.RegisterSingleton(); + + // register the special idk map + registry.RegisterSingleton(); + + // register the services + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.RegisterSingleton(); + registry.Register(factory => + { + var mainLangFolder = new DirectoryInfo(IOHelper.MapPath(SystemDirectories.Umbraco + "/config/lang/")); + var appPlugins = new DirectoryInfo(IOHelper.MapPath(SystemDirectories.AppPlugins)); + var configLangFolder = new DirectoryInfo(IOHelper.MapPath(SystemDirectories.Config + "/lang/")); + + var pluginLangFolders = appPlugins.Exists == false + ? Enumerable.Empty() + : appPlugins.GetDirectories() + .SelectMany(x => x.GetDirectories("Lang")) + .SelectMany(x => x.GetFiles("*.xml", SearchOption.TopDirectoryOnly)) + .Where(x => Path.GetFileNameWithoutExtension(x.FullName).Length == 5) + .Select(x => new LocalizedTextServiceSupplementaryFileSource(x, false)); + + //user defined langs that overwrite the default, these should not be used by plugin creators + var userLangFolders = configLangFolder.Exists == false + ? Enumerable.Empty() + : configLangFolder + .GetFiles("*.user.xml", SearchOption.TopDirectoryOnly) + .Where(x => Path.GetFileNameWithoutExtension(x.FullName).Length == 10) + .Select(x => new LocalizedTextServiceSupplementaryFileSource(x, true)); + + return new LocalizedTextServiceFileSources( + factory.GetInstance(), + factory.GetInstance().RuntimeCache, + mainLangFolder, + pluginLangFolders.Concat(userLangFolders)); + }); + registry.RegisterSingleton(factory => new LocalizedTextService( + factory.GetInstance>(), + factory.GetInstance())); + + //TODO: These are replaced in the web project - we need to declare them so that + // something is wired up, just not sure this is very nice but will work for now. + registry.RegisterSingleton(); + registry.RegisterSingleton(); + + return registry; + } + } +} diff --git a/src/Umbraco.Core/Composing/CompositionRoots/ConfigurationCompositionRoot.cs b/src/Umbraco.Core/Composing/CompositionRoots/ConfigurationCompositionRoot.cs deleted file mode 100644 index 82912163b6..0000000000 --- a/src/Umbraco.Core/Composing/CompositionRoots/ConfigurationCompositionRoot.cs +++ /dev/null @@ -1,23 +0,0 @@ -using LightInject; -using Umbraco.Core.Configuration; -using Umbraco.Core.Configuration.UmbracoSettings; - -namespace Umbraco.Core.Composing.CompositionRoots -{ - /// - /// Sets up IoC container for Umbraco configuration classes - /// - public sealed class ConfigurationCompositionRoot : ICompositionRoot - { - public void Compose(IServiceRegistry container) - { - container.Register(factory => UmbracoConfig.For.UmbracoSettings()); - container.Register(factory => factory.GetInstance().Content); - container.Register(factory => factory.GetInstance().Templates); - container.Register(factory => factory.GetInstance().RequestHandler); - container.Register(factory => UmbracoConfig.For.GlobalSettings()); - - // fixme - other sections we need to add? - } - } -} diff --git a/src/Umbraco.Core/Composing/CompositionRoots/CoreMappingProfilesCompositionRoot.cs b/src/Umbraco.Core/Composing/CompositionRoots/CoreMappingProfilesCompositionRoot.cs deleted file mode 100644 index 6b55a4af7e..0000000000 --- a/src/Umbraco.Core/Composing/CompositionRoots/CoreMappingProfilesCompositionRoot.cs +++ /dev/null @@ -1,13 +0,0 @@ -using LightInject; -using Umbraco.Core.Models.Identity; - -namespace Umbraco.Core.Composing.CompositionRoots -{ - public sealed class CoreMappingProfilesCompositionRoot : ICompositionRoot - { - public void Compose(IServiceRegistry container) - { - container.Register(); - } - } -} diff --git a/src/Umbraco.Core/Composing/CompositionRoots/RepositoryCompositionRoot.cs b/src/Umbraco.Core/Composing/CompositionRoots/RepositoryCompositionRoot.cs deleted file mode 100644 index afea71a074..0000000000 --- a/src/Umbraco.Core/Composing/CompositionRoots/RepositoryCompositionRoot.cs +++ /dev/null @@ -1,87 +0,0 @@ -using System; -using LightInject; -using Umbraco.Core.Cache; -using Umbraco.Core.Configuration.UmbracoSettings; -using Umbraco.Core.IO; -using Umbraco.Core.Logging; -using Umbraco.Core.Persistence.Repositories; -using Umbraco.Core.Persistence.Repositories.Implement; -using Umbraco.Core.Scoping; - -namespace Umbraco.Core.Composing.CompositionRoots -{ - /// - /// Sets the IoC container for the umbraco data layer/repositories/sql/database/etc... - /// - public sealed class RepositoryCompositionRoot : ICompositionRoot - { - public const string DisabledCache = "DisabledCache"; - - public void Compose(IServiceRegistry container) - { - // resolve ctor dependency from GetInstance() runtimeArguments, if possible - 'factory' is - // the container, 'info' describes the ctor argument, and 'args' contains the args that - // were passed to GetInstance() - use first arg if it is the right type, - // - // for ... - //container.RegisterConstructorDependency((factory, info, args) => - //{ - // if (info.Member.DeclaringType != typeof(EntityContainerRepository)) return default; - // return args.Length > 0 && args[0] is Guid guid ? guid : default; - //}); - - // register repositories - // repos depend on various things, - // some repositories have an annotated ctor parameter to pick the right cache helper - - // repositories - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(f => new TemplateRepository( // fixme type the FS too! or? - f.GetInstance(), - f.GetInstance(), - f.GetInstance(), - f.GetInstance(), - f.GetInstance(Constants.Composing.FileSystems.MasterpageFileSystem), - f.GetInstance(Constants.Composing.FileSystems.ViewFileSystem) - )); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - - // repositories that depend on a filesystem - // these have an annotated ctor parameter to pick the right file system - container.RegisterSingleton(f => new PartialViewMacroRepository(f.GetInstance("PartialViewMacroFileSystem"))); - container.RegisterSingleton(f => new PartialViewRepository(f.GetInstance("PartialViewFileSystem"))); - container.RegisterSingleton(f => new ScriptRepository(f.GetInstance("ScriptFileSystem"), f.GetInstance())); - container.RegisterSingleton(f => new StylesheetRepository(f.GetInstance("StylesheetFileSystem"))); - } - } -} diff --git a/src/Umbraco.Core/Composing/CompositionRoots/ServicesCompositionRoot.cs b/src/Umbraco.Core/Composing/CompositionRoots/ServicesCompositionRoot.cs deleted file mode 100644 index d126cd6aa3..0000000000 --- a/src/Umbraco.Core/Composing/CompositionRoots/ServicesCompositionRoot.cs +++ /dev/null @@ -1,93 +0,0 @@ -using System; -using System.IO; -using System.Linq; -using LightInject; -using Umbraco.Core.Cache; -using Umbraco.Core.Events; -using Umbraco.Core.IO; -using Umbraco.Core.Logging; -using Umbraco.Core.Services; -using Umbraco.Core.Services.Implement; - -namespace Umbraco.Core.Composing.CompositionRoots -{ - public sealed class ServicesCompositionRoot : ICompositionRoot - { - public void Compose(IServiceRegistry container) - { - // register a transient messages factory, which will be replaced by the web - // boot manager when running in a web context - container.RegisterSingleton(); - - // register the service context - container.RegisterSingleton(); - - // register the special idk map - container.RegisterSingleton(); - - // register the services - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.RegisterSingleton(); - container.Register(factory => - { - var mainLangFolder = new DirectoryInfo(IOHelper.MapPath(SystemDirectories.Umbraco + "/config/lang/")); - var appPlugins = new DirectoryInfo(IOHelper.MapPath(SystemDirectories.AppPlugins)); - var configLangFolder = new DirectoryInfo(IOHelper.MapPath(SystemDirectories.Config + "/lang/")); - - var pluginLangFolders = appPlugins.Exists == false - ? Enumerable.Empty() - : appPlugins.GetDirectories() - .SelectMany(x => x.GetDirectories("Lang")) - .SelectMany(x => x.GetFiles("*.xml", SearchOption.TopDirectoryOnly)) - .Where(x => Path.GetFileNameWithoutExtension(x.FullName).Length == 5) - .Select(x => new LocalizedTextServiceSupplementaryFileSource(x, false)); - - //user defined langs that overwrite the default, these should not be used by plugin creators - var userLangFolders = configLangFolder.Exists == false - ? Enumerable.Empty() - : configLangFolder - .GetFiles("*.user.xml", SearchOption.TopDirectoryOnly) - .Where(x => Path.GetFileNameWithoutExtension(x.FullName).Length == 10) - .Select(x => new LocalizedTextServiceSupplementaryFileSource(x, true)); - - return new LocalizedTextServiceFileSources( - factory.GetInstance(), - factory.GetInstance().RuntimeCache, - mainLangFolder, - pluginLangFolders.Concat(userLangFolders)); - }); - container.RegisterSingleton(factory => new LocalizedTextService( - factory.GetInstance>(), - factory.GetInstance())); - - //TODO: These are replaced in the web project - we need to declare them so that - // something is wired up, just not sure this is very nice but will work for now. - container.RegisterSingleton(); - container.RegisterSingleton(); - } - } -} diff --git a/src/Umbraco.Core/Composing/Current.cs b/src/Umbraco.Core/Composing/Current.cs index 9e07b42dfb..fcff2c4b9e 100644 --- a/src/Umbraco.Core/Composing/Current.cs +++ b/src/Umbraco.Core/Composing/Current.cs @@ -101,8 +101,8 @@ namespace Umbraco.Core.Composing public static TypeLoader TypeLoader => Container.GetInstance(); - public static FileSystems FileSystems - => Container.GetInstance(); + public static IFileSystems FileSystems + => Container.GetInstance(); public static UrlSegmentProviderCollection UrlSegmentProviders => Container.GetInstance(); diff --git a/src/Umbraco.Core/Composing/IContainer.cs b/src/Umbraco.Core/Composing/IContainer.cs index 55d8ead361..7183a76af2 100644 --- a/src/Umbraco.Core/Composing/IContainer.cs +++ b/src/Umbraco.Core/Composing/IContainer.cs @@ -2,8 +2,6 @@ namespace Umbraco.Core.Composing { - // fixme - must document! - /// /// Defines a container for Umbraco. /// @@ -14,13 +12,7 @@ namespace Umbraco.Core.Composing /// object ConcreteContainer { get; } - /// - /// Gets an instance. - /// - /// The type of the instance. - /// An instance of the specified type. - /// Throws an exception if the container failed to get an instance of the specified type. - T GetInstance(); + #region Factory /// /// Gets an instance. @@ -30,18 +22,31 @@ namespace Umbraco.Core.Composing /// Throws an exception if the container failed to get an instance of the specified type. object GetInstance(Type type); + /// + /// Gets an instance with arguments. + /// + /// The type of the instance. + /// Arguments. + /// An instance of the specified type. + /// + /// Throws an exception if the container failed to get an instance of the specified type. + /// The arguments are used as dependencies by the container. + /// + object GetInstance(Type type, object[] args); + /// /// Tries to get an instance. /// - /// The type of the instance. + /// The type of the instance. /// An instance of the specified type, or null. /// Returns null if the container does not know how to get an instance /// of the specified type. Throws an exception if the container does know how /// to get an instance of the specified type, but failed to do so. - T TryGetInstance(); + object TryGetInstance(Type type); - // fixme document - T GetInstance(object[] args); + #endregion + + #region Registry // fixme register direct type? // fixme register an instance? @@ -55,11 +60,7 @@ namespace Umbraco.Core.Composing /// The type of the collection builder. /// A collection builder of the specified type. T RegisterCollectionBuilder(); - } - public interface IRegistry - { - // everything register should be here - // should a registry also be a container? + #endregion } } diff --git a/src/Umbraco.Core/Composing/LightInject/LightInjectContainer.cs b/src/Umbraco.Core/Composing/LightInject/LightInjectContainer.cs index 8eff2be60b..72ebda62ee 100644 --- a/src/Umbraco.Core/Composing/LightInject/LightInjectContainer.cs +++ b/src/Umbraco.Core/Composing/LightInject/LightInjectContainer.cs @@ -21,6 +21,18 @@ namespace Umbraco.Core.Composing.LightInject /// public object ConcreteContainer => _container; + /// + public object GetInstance(Type type) + => _container.GetInstance(type); + + /// + public object GetInstance(Type type, object[] args) + => _container.GetInstance(type, args); + + /// + public object TryGetInstance(Type type) + => _container.TryGetInstance(type); + /// public void RegisterSingleton(Func factory) => _container.RegisterSingleton(f => factory(this)); @@ -36,21 +48,5 @@ namespace Umbraco.Core.Composing.LightInject /// public T RegisterCollectionBuilder() => _container.RegisterCollectionBuilder(); - - /// - public T TryGetInstance() - => _container.TryGetInstance(); - - /// - public T GetInstance() - => _container.GetInstance(); - - /// - public T GetInstance(object[] args) - => (T) _container.GetInstance(typeof(T), args); - - /// - public object GetInstance(Type type) - => _container.GetInstance(type); } } diff --git a/src/Umbraco.Core/Constants-Composing.cs b/src/Umbraco.Core/Constants-Composing.cs index 1e8c9886d2..e65629a278 100644 --- a/src/Umbraco.Core/Constants-Composing.cs +++ b/src/Umbraco.Core/Constants-Composing.cs @@ -9,20 +9,6 @@ /// Defines constants for composition. /// public static class Composing - { - /// - /// Defines file system names. - /// - public static class FileSystems - { - public const string ScriptFileSystem = "ScriptFileSystem"; - public const string PartialViewFileSystem = "PartialViewFileSystem"; - public const string PartialViewMacroFileSystem = "PartialViewMacroFileSystem"; - public const string StylesheetFileSystem = "StylesheetFileSystem"; - public const string MasterpageFileSystem = "MasterpageFileSystem"; - public const string ViewFileSystem = "ViewFileSystem"; - public const string JavascriptLibraryFileSystem = "JavascriptLibraryFileSystem"; - } - } + { } } } diff --git a/src/Umbraco.Core/ContainerExtensions.cs b/src/Umbraco.Core/ContainerExtensions.cs new file mode 100644 index 0000000000..351a3c26f1 --- /dev/null +++ b/src/Umbraco.Core/ContainerExtensions.cs @@ -0,0 +1,45 @@ +using Umbraco.Core.Composing; + +namespace Umbraco.Core +{ + /// + /// Provides extension methods to the class. + /// + public static class ContainerExtensions + { + /// + /// Gets an instance. + /// + /// The type of the instance. + /// The container. + /// An instance of the specified type. + /// Throws an exception if the container failed to get an instance of the specified type. + public static T GetInstance(this IContainer container) + => (T) container.GetInstance(typeof(T)); + + /// + /// Gets an instance with arguments. + /// + /// The type of the instance. + /// The container. + /// Arguments. + /// An instance of the specified type. + /// + /// Throws an exception if the container failed to get an instance of the specified type. + /// The arguments are used as dependencies by the container. + /// + public static T GetInstance(this IContainer container, object[] args) + => (T) container.GetInstance(typeof(T), args); + + /// + /// Tries to get an instance. + /// + /// The type of the instance. + /// An instance of the specified type, or null. + /// Returns null if the container does not know how to get an instance + /// of the specified type. Throws an exception if the container does know how + /// to get an instance of the specified type, but failed to do so. + public static T TryGetInstance(this IContainer container) + => (T) container.TryGetInstance(typeof(T)); + } +} diff --git a/src/Umbraco.Core/IO/FileSystems.cs b/src/Umbraco.Core/IO/FileSystems.cs index af6d176794..ab7f75a521 100644 --- a/src/Umbraco.Core/IO/FileSystems.cs +++ b/src/Umbraco.Core/IO/FileSystems.cs @@ -12,7 +12,18 @@ using Umbraco.Core.Composing; namespace Umbraco.Core.IO { - public class FileSystems + public interface IFileSystems // fixme move! + { + IFileSystem MacroPartialsFileSystem { get; } + IFileSystem PartialViewsFileSystem { get; } + IFileSystem StylesheetsFileSystem { get; } + IFileSystem ScriptsFileSystem { get; } + IFileSystem MasterPagesFileSystem { get; } + IFileSystem MvcViewsFileSystem { get; } + MediaFileSystem MediaFileSystem { get; } + } + + public class FileSystems : IFileSystems { private readonly IFileSystemProvidersSection _config; private readonly ConcurrentSet _wrappers = new ConcurrentSet(); @@ -36,10 +47,6 @@ namespace Umbraco.Core.IO private MediaFileSystem _mediaFileSystem; - - //fixme - is this needed to be a managed file system? seems irrelevant since it won't ever be moved and is only used in one place in code - private IFileSystem _javascriptLibraryFileSystem; - #region Constructor // DI wants a public ctor @@ -129,16 +136,6 @@ namespace Umbraco.Core.IO } } - //fixme - is this needed to be a managed file system? seems irrelevant since it won't ever be moved and is only used in one place in code - internal IFileSystem JavaScriptLibraryFileSystem - { - get - { - if (Volatile.Read(ref _wkfsInitialized) == false) EnsureWellKnownFileSystems(); - return _javascriptLibraryFileSystem; - } - } - private void EnsureWellKnownFileSystems() { LazyInitializer.EnsureInitialized(ref _wkfsObject, ref _wkfsInitialized, ref _wkfsLock, CreateWellKnownFileSystems); @@ -154,7 +151,6 @@ namespace Umbraco.Core.IO var scriptsFileSystem = new PhysicalFileSystem(SystemDirectories.Scripts); var masterPagesFileSystem = new PhysicalFileSystem(SystemDirectories.Masterpages); var mvcViewsFileSystem = new PhysicalFileSystem(SystemDirectories.MvcViews); - var javaScriptLibraryFileSystem = new PhysicalFileSystem(SystemDirectories.JavaScriptLibrary); _macroPartialFileSystem = new ShadowWrapper(macroPartialFileSystem, "Views/MacroPartials", () => IsScoped()); _partialViewsFileSystem = new ShadowWrapper(partialViewsFileSystem, "Views/Partials", () => IsScoped()); @@ -162,7 +158,6 @@ namespace Umbraco.Core.IO _scriptsFileSystem = new ShadowWrapper(scriptsFileSystem, "scripts", () => IsScoped()); _masterPagesFileSystem = new ShadowWrapper(masterPagesFileSystem, "masterpages", () => IsScoped()); _mvcViewsFileSystem = new ShadowWrapper(mvcViewsFileSystem, "Views", () => IsScoped()); - _javascriptLibraryFileSystem = new ShadowWrapper(javaScriptLibraryFileSystem, "Lib", () => IsScoped()); // filesystems obtained from GetFileSystemProvider are already wrapped and do not need to be wrapped again _mediaFileSystem = GetFileSystemProvider(); @@ -190,7 +185,7 @@ namespace Umbraco.Core.IO /// The alias of the strongly-typed filesystem. /// The non-typed filesystem supporting the strongly-typed filesystem with the specified alias. /// This method should not be used directly, used instead. - public IFileSystem GetUnderlyingFileSystemProvider(string alias) + internal IFileSystem GetUnderlyingFileSystemProvider(string alias) { return GetUnderlyingFileSystemProvider(alias, null); } @@ -303,10 +298,8 @@ namespace Umbraco.Core.IO var innerFs = GetUnderlyingFileSystemNoCache(alias, fallback); var shadowWrapper = new ShadowWrapper(innerFs, "typed/" + alias, () => IsScoped()); - // fixme - switch to using container. where are these registered? - - //var fs = (IFileSystem) Activator.CreateInstance(typeof(TFileSystem), shadowWrapper); - var fs = Current.Container.GetInstance(new object[] { (IFileSystem)shadowWrapper }); + // getting the fs from the container - see FileSystemsComposer + var fs = Current.Container.GetInstance(new object[] { (IFileSystem) shadowWrapper }); _wrappers.Add(shadowWrapper); // keeping a reference to the wrapper return fs; }); diff --git a/src/Umbraco.Core/IO/MediaFileSystem.cs b/src/Umbraco.Core/IO/MediaFileSystem.cs index 77638d171a..47f9f14423 100644 --- a/src/Umbraco.Core/IO/MediaFileSystem.cs +++ b/src/Umbraco.Core/IO/MediaFileSystem.cs @@ -1,15 +1,11 @@ using System; using System.Collections.Generic; using System.Drawing; -using System.Globalization; using System.IO; using System.Linq; -using System.Threading; using System.Threading.Tasks; -using Umbraco.Core.Configuration; using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.Exceptions; -using Umbraco.Core.IO.MediaPathSchemes; using Umbraco.Core.Logging; using Umbraco.Core.Media; using Umbraco.Core.Media.Exif; diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/PartialViewMacroRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/PartialViewMacroRepository.cs index 879766fc81..d707bcee10 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/PartialViewMacroRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/PartialViewMacroRepository.cs @@ -5,9 +5,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement { internal class PartialViewMacroRepository : PartialViewRepository, IPartialViewMacroRepository { - - public PartialViewMacroRepository(IFileSystem fileSystem) - : base(fileSystem) + public PartialViewMacroRepository(IFileSystems fileSystems) + : base(fileSystems.MacroPartialsFileSystem) { } protected override PartialViewType ViewType => PartialViewType.PartialViewMacro; diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/PartialViewRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/PartialViewRepository.cs index a996251927..d04bc47cd8 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/PartialViewRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/PartialViewRepository.cs @@ -9,7 +9,11 @@ namespace Umbraco.Core.Persistence.Repositories.Implement { internal class PartialViewRepository : FileRepository, IPartialViewRepository { - public PartialViewRepository(IFileSystem fileSystem) + public PartialViewRepository(IFileSystems fileSystems) + : base(fileSystems.PartialViewsFileSystem) + { } + + protected PartialViewRepository(IFileSystem fileSystem) : base(fileSystem) { } diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/ScriptRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/ScriptRepository.cs index 735a1aa74f..85b41a2a1c 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/ScriptRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/ScriptRepository.cs @@ -15,8 +15,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement { private readonly IContentSection _contentConfig; - public ScriptRepository(IFileSystem fileSystem, IContentSection contentConfig) - : base(fileSystem) + public ScriptRepository(IFileSystems fileSystems, IContentSection contentConfig) + : base(fileSystems.ScriptsFileSystem) { _contentConfig = contentConfig ?? throw new ArgumentNullException(nameof(contentConfig)); } diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/StylesheetRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/StylesheetRepository.cs index 8139f4948e..4c02a8f4b5 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/StylesheetRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/StylesheetRepository.cs @@ -11,8 +11,8 @@ namespace Umbraco.Core.Persistence.Repositories.Implement /// internal class StylesheetRepository : FileRepository, IStylesheetRepository { - public StylesheetRepository(IFileSystem fileSystem) - : base(fileSystem) + public StylesheetRepository(IFileSystems fileSystems) + : base(fileSystems.StylesheetsFileSystem) { } #region Overrides of FileRepository diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/TemplateRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/TemplateRepository.cs index 6541876b67..ba4e22de41 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/TemplateRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/TemplateRepository.cs @@ -29,13 +29,11 @@ namespace Umbraco.Core.Persistence.Repositories.Implement private readonly ViewHelper _viewHelper; private readonly MasterPageHelper _masterPageHelper; - public TemplateRepository(IScopeAccessor scopeAccessor, CacheHelper cache, ILogger logger, ITemplatesSection templateConfig, - IFileSystem masterpageFileSystem, - IFileSystem viewFileSystem) + public TemplateRepository(IScopeAccessor scopeAccessor, CacheHelper cache, ILogger logger, ITemplatesSection templateConfig, IFileSystems fileSystems) : base(scopeAccessor, cache, logger) { - _masterpagesFileSystem = masterpageFileSystem; - _viewsFileSystem = viewFileSystem; + _masterpagesFileSystem = fileSystems.MasterPagesFileSystem; + _viewsFileSystem = fileSystems.MvcViewsFileSystem; _templateConfig = templateConfig; _viewHelper = new ViewHelper(_viewsFileSystem); _masterPageHelper = new MasterPageHelper(_masterpagesFileSystem); @@ -151,7 +149,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement //Save to db var template = (Template)entity; template.AddingEntity(); - + var dto = TemplateFactory.BuildDto(template, NodeObjectTypeId, template.Id); //Create the (base) node data - umbracoNode diff --git a/src/Umbraco.Core/Persistence/UmbracoDatabaseFactory.cs b/src/Umbraco.Core/Persistence/UmbracoDatabaseFactory.cs index 2b82ec7fac..8d2a230fec 100644 --- a/src/Umbraco.Core/Persistence/UmbracoDatabaseFactory.cs +++ b/src/Umbraco.Core/Persistence/UmbracoDatabaseFactory.cs @@ -50,7 +50,7 @@ namespace Umbraco.Core.Persistence /// /// Initializes a new instance of the . /// - /// Used by LightInject. + /// Used by injection. public UmbracoDatabaseFactory(IEnumerable sqlSyntaxProviders, ILogger logger, IMapperCollection mappers) : this(Constants.System.UmbracoConnectionName, sqlSyntaxProviders, logger, mappers) { diff --git a/src/Umbraco.Core/Runtime/CoreRuntime.cs b/src/Umbraco.Core/Runtime/CoreRuntime.cs index 93f475f7a6..94004c6ae3 100644 --- a/src/Umbraco.Core/Runtime/CoreRuntime.cs +++ b/src/Umbraco.Core/Runtime/CoreRuntime.cs @@ -7,7 +7,7 @@ using LightInject; using Umbraco.Core.Cache; using Umbraco.Core.Components; using Umbraco.Core.Composing; -using Umbraco.Core.Composing.CompositionRoots; +using Umbraco.Core.Composing.Composers; using Umbraco.Core.Configuration; using Umbraco.Core.Exceptions; using Umbraco.Core.IO; @@ -195,7 +195,7 @@ namespace Umbraco.Core.Runtime container.RegisterSingleton(); container.RegisterSingleton(); - container.RegisterFrom(); + container.ComposeConfiguration(); // register caches // need the deep clone runtime cache profiver to ensure entities are cached properly, ie diff --git a/src/Umbraco.Core/Runtime/CoreRuntimeComponent.cs b/src/Umbraco.Core/Runtime/CoreRuntimeComponent.cs index ce249d6b4a..4d1fd28462 100644 --- a/src/Umbraco.Core/Runtime/CoreRuntimeComponent.cs +++ b/src/Umbraco.Core/Runtime/CoreRuntimeComponent.cs @@ -7,7 +7,7 @@ using LightInject; using Umbraco.Core.Cache; using Umbraco.Core.Components; using Umbraco.Core.Composing; -using Umbraco.Core.Composing.CompositionRoots; +using Umbraco.Core.Composing.Composers; using Umbraco.Core.Configuration; using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.IO; @@ -35,29 +35,16 @@ namespace Umbraco.Core.Runtime { base.Compose(composition); - // register from roots - composition.Container.RegisterFrom(); - composition.Container.RegisterFrom(); - composition.Container.RegisterFrom(); + // composers + composition.Container.ComposeRepositories(); + composition.Container.ComposeServices(); + composition.Container.ComposeCoreMappingProfiles(); + composition.Container.ComposeFileSystems(); // register database builder // *not* a singleton, don't want to keep it around composition.Container.Register(); - // register filesystems - - composition.Container.Register((f, wrappedFileSystem) => new MediaFileSystem(wrappedFileSystem, f.GetInstance(), f.GetInstance(), f.GetInstance())); - composition.Container.RegisterConstructorDependency((factory, parameterInfo) => factory.GetInstance().MediaFileSystem); - - composition.Container.RegisterSingleton(); - composition.Container.RegisterSingleton(factory => factory.GetInstance().MediaFileSystem); - composition.Container.RegisterSingleton(factory => factory.GetInstance().ScriptsFileSystem, Constants.Composing.FileSystems.ScriptFileSystem); - composition.Container.RegisterSingleton(factory => factory.GetInstance().PartialViewsFileSystem, Constants.Composing.FileSystems.PartialViewFileSystem); - composition.Container.RegisterSingleton(factory => factory.GetInstance().MacroPartialsFileSystem, Constants.Composing.FileSystems.PartialViewMacroFileSystem); - composition.Container.RegisterSingleton(factory => factory.GetInstance().StylesheetsFileSystem, Constants.Composing.FileSystems.StylesheetFileSystem); - composition.Container.RegisterSingleton(factory => factory.GetInstance().MasterPagesFileSystem, Constants.Composing.FileSystems.MasterpageFileSystem); - composition.Container.RegisterSingleton(factory => factory.GetInstance().MvcViewsFileSystem, Constants.Composing.FileSystems.ViewFileSystem); - // register manifest parser, will be injected in collection builders where needed composition.Container.RegisterSingleton(); diff --git a/src/Umbraco.Core/Services/ServiceContext.cs b/src/Umbraco.Core/Services/ServiceContext.cs index aa618e7927..b14158efd5 100644 --- a/src/Umbraco.Core/Services/ServiceContext.cs +++ b/src/Umbraco.Core/Services/ServiceContext.cs @@ -134,7 +134,7 @@ namespace Umbraco.Core.Services if (redirectUrlService != null) _redirectUrlService = new Lazy(() => redirectUrlService); if (consentService != null) _consentService = new Lazy(() => consentService); } - + /// /// Gets the /// diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 7bcd3dccae..49990db5de 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -158,10 +158,11 @@ - - - - + + + + + @@ -305,6 +306,7 @@ + diff --git a/src/Umbraco.Tests/FrontEnd/UmbracoHelperTests.cs b/src/Umbraco.Tests/FrontEnd/UmbracoHelperTests.cs index 74a47300ff..3d33604870 100644 --- a/src/Umbraco.Tests/FrontEnd/UmbracoHelperTests.cs +++ b/src/Umbraco.Tests/FrontEnd/UmbracoHelperTests.cs @@ -1,14 +1,12 @@ using System; using System.Collections.Generic; using System.Text; -using LightInject; using Moq; using NUnit.Framework; using Umbraco.Core; using Umbraco.Tests.TestHelpers; using Umbraco.Core.Cache; using Umbraco.Core.Composing; -using Umbraco.Core.Composing.LightInject; using Umbraco.Core.Logging; using Umbraco.Web; diff --git a/src/Umbraco.Tests/Models/ContentTests.cs b/src/Umbraco.Tests/Models/ContentTests.cs index 01b08d9ae9..ba1a4e739c 100644 --- a/src/Umbraco.Tests/Models/ContentTests.cs +++ b/src/Umbraco.Tests/Models/ContentTests.cs @@ -41,6 +41,7 @@ namespace Umbraco.Tests.Models Container.Register(_ => Mock.Of()); Container.Register((factory, fileSystem) => new MediaFileSystem(fileSystem, factory.GetInstance(), factory.GetInstance(), factory.GetInstance())); Container.Register(); + Container.Register(factory => factory.GetInstance()); Container.Register(_ => Mock.Of()); Container.Register(_ => Mock.Of()); } diff --git a/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs index 29de77e6d8..2a3b197218 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs @@ -63,7 +63,7 @@ namespace Umbraco.Tests.Persistence.Repositories { cacheHelper = cacheHelper ?? CacheHelper; - templateRepository = new TemplateRepository(scopeAccessor, cacheHelper, Logger, Mock.Of(), Mock.Of(), Mock.Of()); + templateRepository = new TemplateRepository(scopeAccessor, cacheHelper, Logger, Mock.Of(), TestObjects.GetFileSystemsMock()); var tagRepository = new TagRepository(scopeAccessor, cacheHelper, Logger); contentTypeRepository = new ContentTypeRepository(scopeAccessor, cacheHelper, Logger, templateRepository); var languageRepository = new LanguageRepository(scopeAccessor, cacheHelper, Logger); diff --git a/src/Umbraco.Tests/Persistence/Repositories/ContentTypeRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/ContentTypeRepositoryTest.cs index 9be7fe434a..e4f794763d 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/ContentTypeRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/ContentTypeRepositoryTest.cs @@ -36,7 +36,7 @@ namespace Umbraco.Tests.Persistence.Repositories private DocumentRepository CreateRepository(IScopeAccessor scopeAccessor, out ContentTypeRepository contentTypeRepository) { var cacheHelper = CacheHelper.Disabled; - var templateRepository = new TemplateRepository(scopeAccessor, cacheHelper, Logger, Mock.Of(), Mock.Of(), Mock.Of()); + var templateRepository = new TemplateRepository(scopeAccessor, cacheHelper, Logger, Mock.Of(), TestObjects.GetFileSystemsMock()); var tagRepository = new TagRepository(scopeAccessor, cacheHelper, Logger); contentTypeRepository = new ContentTypeRepository(scopeAccessor, cacheHelper, Logger, templateRepository); var languageRepository = new LanguageRepository(scopeAccessor, cacheHelper, Logger); @@ -46,7 +46,7 @@ namespace Umbraco.Tests.Persistence.Repositories private ContentTypeRepository CreateRepository(IScopeAccessor scopeAccessor) { - var templateRepository = new TemplateRepository(scopeAccessor, CacheHelper.Disabled, Logger, Mock.Of(), Mock.Of(), Mock.Of()); + var templateRepository = new TemplateRepository(scopeAccessor, CacheHelper.Disabled, Logger, Mock.Of(), TestObjects.GetFileSystemsMock()); var contentTypeRepository = new ContentTypeRepository(scopeAccessor, CacheHelper.Disabled, Logger, templateRepository); return contentTypeRepository; } @@ -72,7 +72,7 @@ namespace Umbraco.Tests.Persistence.Repositories var provider = TestObjects.GetScopeProvider(Logger); using (var scope = provider.CreateScope()) { - var templateRepo = new TemplateRepository((IScopeAccessor) provider, CacheHelper.Disabled, Logger, Mock.Of(), Mock.Of(), Mock.Of()); + var templateRepo = new TemplateRepository((IScopeAccessor) provider, CacheHelper.Disabled, Logger, Mock.Of(), TestObjects.GetFileSystemsMock()); var repository = CreateRepository((IScopeAccessor) provider); var templates = new[] { diff --git a/src/Umbraco.Tests/Persistence/Repositories/DomainRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/DomainRepositoryTest.cs index 070ef781cf..a5402f964e 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/DomainRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/DomainRepositoryTest.cs @@ -22,7 +22,7 @@ namespace Umbraco.Tests.Persistence.Repositories private DomainRepository CreateRepository(IScopeProvider provider, out ContentTypeRepository contentTypeRepository, out DocumentRepository documentRepository, out LanguageRepository languageRepository) { var accessor = (IScopeAccessor) provider; - var templateRepository = new TemplateRepository(accessor, Core.Cache.CacheHelper.Disabled, Logger, Mock.Of(), Mock.Of(), Mock.Of()); + var templateRepository = new TemplateRepository(accessor, Core.Cache.CacheHelper.Disabled, Logger, Mock.Of(), TestObjects.GetFileSystemsMock()); var tagRepository = new TagRepository(accessor, Core.Cache.CacheHelper.Disabled, Logger); contentTypeRepository = new ContentTypeRepository(accessor, Core.Cache.CacheHelper.Disabled, Logger, templateRepository); languageRepository = new LanguageRepository(accessor, Core.Cache.CacheHelper.Disabled, Logger); diff --git a/src/Umbraco.Tests/Persistence/Repositories/PartialViewRepositoryTests.cs b/src/Umbraco.Tests/Persistence/Repositories/PartialViewRepositoryTests.cs index cf307d2ea9..79cb1dd4f1 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/PartialViewRepositoryTests.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/PartialViewRepositoryTests.cs @@ -1,4 +1,5 @@ using System.Linq; +using Moq; using NUnit.Framework; using Umbraco.Core.IO; using Umbraco.Core.Models; @@ -37,10 +38,13 @@ namespace Umbraco.Tests.Persistence.Repositories { // unless noted otherwise, no changes / 7.2.8 + var fileSystems = Mock.Of(); + Mock.Get(fileSystems).Setup(x => x.PartialViewsFileSystem).Returns(_fileSystem); + var provider = TestObjects.GetScopeProvider(Logger); using (var scope = provider.CreateScope()) { - var repository = new PartialViewRepository(_fileSystem); + var repository = new PartialViewRepository(fileSystems); var partialView = new PartialView(PartialViewType.PartialView, "test-path-1.cshtml") { Content = "// partialView" }; repository.Save(partialView); diff --git a/src/Umbraco.Tests/Persistence/Repositories/PublicAccessRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/PublicAccessRepositoryTest.cs index 39b3b0f797..e76d794e69 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/PublicAccessRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/PublicAccessRepositoryTest.cs @@ -307,7 +307,7 @@ namespace Umbraco.Tests.Persistence.Repositories private DocumentRepository CreateRepository(IScopeProvider provider, out ContentTypeRepository contentTypeRepository) { var accessor = (IScopeAccessor) provider; - var templateRepository = new TemplateRepository(accessor, CacheHelper, Logger, Mock.Of(), Mock.Of(), Mock.Of()); + var templateRepository = new TemplateRepository(accessor, CacheHelper, Logger, Mock.Of(), TestObjects.GetFileSystemsMock()); var tagRepository = new TagRepository(accessor, CacheHelper, Logger); contentTypeRepository = new ContentTypeRepository(accessor, CacheHelper, Logger, templateRepository); var languageRepository = new LanguageRepository(accessor, CacheHelper, Logger); diff --git a/src/Umbraco.Tests/Persistence/Repositories/ScriptRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/ScriptRepositoryTest.cs index 755682a913..e414fc1c3a 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/ScriptRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/ScriptRepositoryTest.cs @@ -7,10 +7,8 @@ using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.Composing; using Umbraco.Core.IO; using Umbraco.Core.Models; -using Umbraco.Core.Persistence.Repositories; using Umbraco.Core.Persistence.Repositories.Implement; using Umbraco.Core.PropertyEditors; -using Umbraco.Core.Scoping; using Umbraco.Tests.TestHelpers; using Umbraco.Tests.Testing; @@ -20,13 +18,16 @@ namespace Umbraco.Tests.Persistence.Repositories [UmbracoTest(WithApplication = true, Database = UmbracoTestOptions.Database.NewEmptyPerFixture)] public class ScriptRepositoryTest : TestWithDatabaseBase { + private IFileSystems _fileSystems; private IFileSystem _fileSystem; public override void SetUp() { base.SetUp(); + _fileSystems = Mock.Of(); _fileSystem = new PhysicalFileSystem(SystemDirectories.Scripts); + Mock.Get(_fileSystems).Setup(x => x.ScriptsFileSystem).Returns(_fileSystem); using (var stream = CreateStream("Umbraco.Sys.registerNamespace(\"Umbraco.Utils\");")) { _fileSystem.AddFile("test-script.js", stream); @@ -47,9 +48,8 @@ namespace Umbraco.Tests.Persistence.Repositories var provider = TestObjects.GetScopeProvider(Logger); using (var scope = ScopeProvider.CreateScope()) { - // Act - var repository = new ScriptRepository(_fileSystem, Mock.Of()); + var repository = new ScriptRepository(_fileSystems, Mock.Of()); // Assert Assert.That(repository, Is.Not.Null); @@ -63,7 +63,7 @@ namespace Umbraco.Tests.Persistence.Repositories var provider = TestObjects.GetScopeProvider(Logger); using (var scope = ScopeProvider.CreateScope()) { - var repository = new ScriptRepository(_fileSystem, Mock.Of()); + var repository = new ScriptRepository(_fileSystems, Mock.Of()); // Act var script = new Script("test-add-script.js") { Content = "/// " }; @@ -82,7 +82,7 @@ namespace Umbraco.Tests.Persistence.Repositories var provider = TestObjects.GetScopeProvider(Logger); using (var scope = ScopeProvider.CreateScope()) { - var repository = new ScriptRepository(_fileSystem, Mock.Of()); + var repository = new ScriptRepository(_fileSystems, Mock.Of()); // Act var script = new Script("test-updated-script.js") { Content = "/// " }; @@ -108,7 +108,7 @@ namespace Umbraco.Tests.Persistence.Repositories var provider = TestObjects.GetScopeProvider(Logger); using (var scope = ScopeProvider.CreateScope()) { - var repository = new ScriptRepository(_fileSystem, Mock.Of()); + var repository = new ScriptRepository(_fileSystems, Mock.Of()); // Act var script = repository.Get("test-script.js"); @@ -128,7 +128,7 @@ namespace Umbraco.Tests.Persistence.Repositories var provider = TestObjects.GetScopeProvider(Logger); using (var scope = ScopeProvider.CreateScope()) { - var repository = new ScriptRepository(_fileSystem, Mock.Of()); + var repository = new ScriptRepository(_fileSystems, Mock.Of()); // Act var exists = repository.Get("test-script.js"); @@ -147,7 +147,7 @@ namespace Umbraco.Tests.Persistence.Repositories var provider = TestObjects.GetScopeProvider(Logger); using (var scope = ScopeProvider.CreateScope()) { - var repository = new ScriptRepository(_fileSystem, Mock.Of()); + var repository = new ScriptRepository(_fileSystems, Mock.Of()); var script = new Script("test-script1.js") { Content = "/// " }; repository.Save(script); @@ -175,7 +175,7 @@ namespace Umbraco.Tests.Persistence.Repositories var provider = TestObjects.GetScopeProvider(Logger); using (var scope = ScopeProvider.CreateScope()) { - var repository = new ScriptRepository(_fileSystem, Mock.Of()); + var repository = new ScriptRepository(_fileSystems, Mock.Of()); var script = new Script("test-script1.js") { Content = "/// " }; repository.Save(script); @@ -203,7 +203,7 @@ namespace Umbraco.Tests.Persistence.Repositories var provider = TestObjects.GetScopeProvider(Logger); using (var scope = ScopeProvider.CreateScope()) { - var repository = new ScriptRepository(_fileSystem, Mock.Of()); + var repository = new ScriptRepository(_fileSystems, Mock.Of()); // Act var exists = repository.Exists("test-script.js"); @@ -222,7 +222,7 @@ namespace Umbraco.Tests.Persistence.Repositories var provider = TestObjects.GetScopeProvider(Logger); using (var scope = ScopeProvider.CreateScope()) { - var repository = new ScriptRepository(_fileSystem, Mock.Of()); + var repository = new ScriptRepository(_fileSystems, Mock.Of()); var script = new Script("test-move-script.js") { Content = content }; repository.Save(script); @@ -255,7 +255,7 @@ namespace Umbraco.Tests.Persistence.Repositories var provider = TestObjects.GetScopeProvider(Logger); using (var scope = ScopeProvider.CreateScope()) { - var repository = new ScriptRepository(_fileSystem, Mock.Of()); + var repository = new ScriptRepository(_fileSystems, Mock.Of()); var script = new Script("test-path-1.js") { Content = "// script" }; repository.Save(script); @@ -328,11 +328,11 @@ namespace Umbraco.Tests.Persistence.Repositories base.TearDown(); //Delete all files - Purge((PhysicalFileSystem) _fileSystem, ""); - _fileSystem = null; + Purge(_fileSystems.ScriptsFileSystem, ""); + _fileSystems = null; } - private void Purge(PhysicalFileSystem fs, string path) + private void Purge(IFileSystem fs, string path) { var files = fs.GetFiles(path, "*.js"); foreach (var file in files) diff --git a/src/Umbraco.Tests/Persistence/Repositories/StylesheetRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/StylesheetRepositoryTest.cs index c87a976ab8..61fcd8aabe 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/StylesheetRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/StylesheetRepositoryTest.cs @@ -1,17 +1,12 @@ -using System; -using System.Data; +using System.Data; using System.IO; using System.Linq; using System.Text; using Moq; using NUnit.Framework; using Umbraco.Core.IO; -using Umbraco.Core.Logging; using Umbraco.Core.Models; -using Umbraco.Core.Persistence; -using Umbraco.Core.Persistence.Repositories; using Umbraco.Core.Persistence.Repositories.Implement; -using Umbraco.Core.Scoping; using Umbraco.Tests.TestHelpers; using Umbraco.Tests.Testing; @@ -21,13 +16,16 @@ namespace Umbraco.Tests.Persistence.Repositories [UmbracoTest(Database = UmbracoTestOptions.Database.NewSchemaPerFixture)] public class StylesheetRepositoryTest : TestWithDatabaseBase { + private IFileSystems _fileSystems; private IFileSystem _fileSystem; public override void SetUp() { base.SetUp(); + _fileSystems = Mock.Of(); _fileSystem = new PhysicalFileSystem(SystemDirectories.Css); + Mock.Get(_fileSystems).Setup(x => x.StylesheetsFileSystem).Returns(_fileSystem); var stream = CreateStream("body {background:#EE7600; color:#FFF;}"); _fileSystem.AddFile("styles.css", stream); } @@ -36,11 +34,10 @@ namespace Umbraco.Tests.Persistence.Repositories public void Can_Instantiate_Repository() { // Arrange - var provider = TestObjects.GetScopeProvider(Logger); - using (var scope = ScopeProvider.CreateScope()) + using (ScopeProvider.CreateScope()) { // Act - var repository = new StylesheetRepository(_fileSystem); + var repository = new StylesheetRepository(_fileSystems); // Assert @@ -52,10 +49,9 @@ namespace Umbraco.Tests.Persistence.Repositories public void Can_Perform_Add() { // Arrange - var provider = TestObjects.GetScopeProvider(Logger); - using (var scope = ScopeProvider.CreateScope()) + using (ScopeProvider.CreateScope()) { - var repository = new StylesheetRepository(_fileSystem); + var repository = new StylesheetRepository(_fileSystems); // Act var stylesheet = new Stylesheet("test-add.css") { Content = "body { color:#000; } .bold {font-weight:bold;}" }; @@ -71,10 +67,9 @@ namespace Umbraco.Tests.Persistence.Repositories public void Can_Perform_Update() { // Arrange - var provider = TestObjects.GetScopeProvider(Logger); - using (var scope = ScopeProvider.CreateScope()) + using (ScopeProvider.CreateScope()) { - var repository = new StylesheetRepository(_fileSystem); + var repository = new StylesheetRepository(_fileSystems); // Act var stylesheet = new Stylesheet("test-update.css") { Content = "body { color:#000; } .bold {font-weight:bold;}" }; @@ -99,10 +94,9 @@ namespace Umbraco.Tests.Persistence.Repositories public void Can_Perform_Update_With_Property() { // Arrange - var provider = TestObjects.GetScopeProvider(Logger); - using (var scope = ScopeProvider.CreateScope()) + using (ScopeProvider.CreateScope()) { - var repository = new StylesheetRepository(_fileSystem); + var repository = new StylesheetRepository(_fileSystems); // Act var stylesheet = new Stylesheet("test-update.css") { Content = "body { color:#000; } .bold {font-weight:bold;}" }; @@ -130,10 +124,9 @@ p{font-size:2em;}")); public void Throws_When_Adding_Duplicate_Properties() { // Arrange - var provider = TestObjects.GetScopeProvider(Logger); - using (var scope = ScopeProvider.CreateScope()) + using (ScopeProvider.CreateScope()) { - var repository = new StylesheetRepository(_fileSystem); + var repository = new StylesheetRepository(_fileSystems); // Act var stylesheet = new Stylesheet("test-update.css") { Content = "body { color:#000; } .bold {font-weight:bold;}" }; @@ -150,10 +143,9 @@ p{font-size:2em;}")); public void Can_Perform_Delete() { // Arrange - var provider = TestObjects.GetScopeProvider(Logger); - using (var scope = ScopeProvider.CreateScope()) + using (ScopeProvider.CreateScope()) { - var repository = new StylesheetRepository(_fileSystem); + var repository = new StylesheetRepository(_fileSystems); // Act var stylesheet = new Stylesheet("test-delete.css") { Content = "body { color:#000; } .bold {font-weight:bold;}" }; @@ -172,10 +164,9 @@ p{font-size:2em;}")); public void Can_Perform_Get() { // Arrange - var provider = TestObjects.GetScopeProvider(Logger); - using (var scope = ScopeProvider.CreateScope()) + using (ScopeProvider.CreateScope()) { - var repository = new StylesheetRepository(_fileSystem); + var repository = new StylesheetRepository(_fileSystems); // Act var stylesheet = repository.Get("styles.css"); @@ -192,10 +183,9 @@ p{font-size:2em;}")); public void Can_Perform_GetAll() { // Arrange - var provider = TestObjects.GetScopeProvider(Logger); - using (var scope = ScopeProvider.CreateScope()) + using (ScopeProvider.CreateScope()) { - var repository = new StylesheetRepository(_fileSystem); + var repository = new StylesheetRepository(_fileSystems); var stylesheet = new Stylesheet("styles-v2.css") { Content = "body { color:#000; } .bold {font-weight:bold;}" }; repository.Save(stylesheet); @@ -216,10 +206,9 @@ p{font-size:2em;}")); public void Can_Perform_GetAll_With_Params() { // Arrange - var provider = TestObjects.GetScopeProvider(Logger); - using (var scope = ScopeProvider.CreateScope()) + using (ScopeProvider.CreateScope()) { - var repository = new StylesheetRepository(_fileSystem); + var repository = new StylesheetRepository(_fileSystems); var stylesheet = new Stylesheet("styles-v2.css") { Content = "body { color:#000; } .bold {font-weight:bold;}" }; repository.Save(stylesheet); @@ -240,10 +229,9 @@ p{font-size:2em;}")); public void Can_Perform_Exists() { // Arrange - var provider = TestObjects.GetScopeProvider(Logger); - using (var scope = ScopeProvider.CreateScope()) + using (ScopeProvider.CreateScope()) { - var repository = new StylesheetRepository(_fileSystem); + var repository = new StylesheetRepository(_fileSystems); // Act var exists = repository.Exists("styles.css"); @@ -258,10 +246,9 @@ p{font-size:2em;}")); { // unless noted otherwise, no changes / 7.2.8 - var provider = TestObjects.GetScopeProvider(Logger); - using (var scope = ScopeProvider.CreateScope()) + using (ScopeProvider.CreateScope()) { - var repository = new StylesheetRepository(_fileSystem); + var repository = new StylesheetRepository(_fileSystems); var stylesheet = new Stylesheet("test-path-1.css") { Content = "body { color:#000; } .bold {font-weight:bold;}" }; repository.Save(stylesheet); diff --git a/src/Umbraco.Tests/Persistence/Repositories/TagRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/TagRepositoryTest.cs index 65156df08d..78eb736007 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/TagRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/TagRepositoryTest.cs @@ -953,7 +953,7 @@ namespace Umbraco.Tests.Persistence.Repositories private DocumentRepository CreateContentRepository(IScopeProvider provider, out ContentTypeRepository contentTypeRepository) { var accessor = (IScopeAccessor) provider; - var templateRepository = new TemplateRepository(accessor, CacheHelper.Disabled, Logger, Mock.Of(), Mock.Of(), Mock.Of()); + var templateRepository = new TemplateRepository(accessor, CacheHelper.Disabled, Logger, Mock.Of(), TestObjects.GetFileSystemsMock()); var tagRepository = new TagRepository(accessor, CacheHelper.Disabled, Logger); contentTypeRepository = new ContentTypeRepository(accessor, CacheHelper.Disabled, Logger, templateRepository); var languageRepository = new LanguageRepository(accessor, CacheHelper.Disabled, Logger); diff --git a/src/Umbraco.Tests/Persistence/Repositories/TemplateRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/TemplateRepositoryTest.cs index 69bbc46b57..b9bbfbb363 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/TemplateRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/TemplateRepositoryTest.cs @@ -23,47 +23,46 @@ namespace Umbraco.Tests.Persistence.Repositories [UmbracoTest(Database = UmbracoTestOptions.Database.NewSchemaPerTest)] public class TemplateRepositoryTest : TestWithDatabaseBase { - private IFileSystem _masterPageFileSystem; - private IFileSystem _viewsFileSystem; + private IFileSystems _fileSystems; private ITemplateRepository CreateRepository(IScopeProvider provider, ITemplatesSection templatesSection = null) { return new TemplateRepository((IScopeAccessor) provider, CacheHelper.Disabled, Logger, templatesSection ?? Mock.Of(t => t.DefaultRenderingEngine == RenderingEngine.Mvc), - _masterPageFileSystem, _viewsFileSystem); + _fileSystems); } public override void SetUp() { base.SetUp(); - _masterPageFileSystem = new PhysicalFileSystem(SystemDirectories.Masterpages); - _viewsFileSystem = new PhysicalFileSystem(SystemDirectories.MvcViews); + _fileSystems = Mock.Of(); + var masterPageFileSystem = new PhysicalFileSystem(SystemDirectories.Masterpages); + Mock.Get(_fileSystems).Setup(x => x.MasterPagesFileSystem).Returns(masterPageFileSystem); + var viewsFileSystem = new PhysicalFileSystem(SystemDirectories.MvcViews); + Mock.Get(_fileSystems).Setup(x => x.MvcViewsFileSystem).Returns(viewsFileSystem); } [Test] public void Can_Instantiate_Repository() { // Arrange - var provider = TestObjects.GetScopeProvider(Logger); - using (var scope = ScopeProvider.CreateScope()) + using (ScopeProvider.CreateScope()) { - var repository = CreateRepository(provider); + var repository = CreateRepository(ScopeProvider); // Assert Assert.That(repository, Is.Not.Null); } - } [Test] public void Can_Perform_Add_MasterPage_Detect_Content() { // Arrange - var provider = TestObjects.GetScopeProvider(Logger); - using (var scope = ScopeProvider.CreateScope()) + using (ScopeProvider.CreateScope()) { - var repository = CreateRepository(provider); + var repository = CreateRepository(ScopeProvider); // Act var template = new Template("test", "test") @@ -71,32 +70,28 @@ namespace Umbraco.Tests.Persistence.Repositories Content = @"<%@ Master Language=""C#"" %>" }; repository.Save(template); - //Assert Assert.That(repository.Get("test"), Is.Not.Null); - Assert.That(_masterPageFileSystem.FileExists("test.master"), Is.True); + Assert.That(_fileSystems.MasterPagesFileSystem.FileExists("test.master"), Is.True); } - } [Test] public void Can_Perform_Add_MasterPage_With_Default_Content() { // Arrange - var provider = TestObjects.GetScopeProvider(Logger); - using (var scope = ScopeProvider.CreateScope()) + using (ScopeProvider.CreateScope()) { - var repository = CreateRepository(provider, Mock.Of(x => x.DefaultRenderingEngine == RenderingEngine.WebForms)); + var repository = CreateRepository(ScopeProvider, Mock.Of(x => x.DefaultRenderingEngine == RenderingEngine.WebForms)); // Act var template = new Template("test", "test"); repository.Save(template); - //Assert Assert.That(repository.Get("test"), Is.Not.Null); - Assert.That(_masterPageFileSystem.FileExists("test.master"), Is.True); + Assert.That(_fileSystems.MasterPagesFileSystem.FileExists("test.master"), Is.True); Assert.AreEqual(@"<%@ Master Language=""C#"" MasterPageFile=""~/umbraco/masterpages/default.master"" AutoEventWireup=""true"" %> @@ -104,47 +99,41 @@ namespace Umbraco.Tests.Persistence.Repositories ".StripWhitespace(), template.Content.StripWhitespace()); } - } [Test] public void Can_Perform_Add_MasterPage_With_Default_Content_With_Parent() { // Arrange - var provider = TestObjects.GetScopeProvider(Logger); - using (var scope = ScopeProvider.CreateScope()) + using (ScopeProvider.CreateScope()) { - var repository = CreateRepository(provider, Mock.Of(x => x.DefaultRenderingEngine == RenderingEngine.WebForms)); + var repository = CreateRepository(ScopeProvider, Mock.Of(x => x.DefaultRenderingEngine == RenderingEngine.WebForms)); //NOTE: This has to be persisted first var template = new Template("test", "test"); repository.Save(template); - // Act var template2 = new Template("test2", "test2"); template2.SetMasterTemplate(template); repository.Save(template2); - //Assert Assert.That(repository.Get("test2"), Is.Not.Null); - Assert.That(_masterPageFileSystem.FileExists("test2.master"), Is.True); + Assert.That(_fileSystems.MasterPagesFileSystem.FileExists("test2.master"), Is.True); Assert.AreEqual(@"<%@ Master Language=""C#"" MasterPageFile=""~/masterpages/test.master"" AutoEventWireup=""true"" %> ".StripWhitespace(), template2.Content.StripWhitespace()); } - } [Test] public void Can_Perform_Add_View() { // Arrange - var provider = TestObjects.GetScopeProvider(Logger); - using (var scope = ScopeProvider.CreateScope()) + using (ScopeProvider.CreateScope()) { - var repository = CreateRepository(provider); + var repository = CreateRepository(ScopeProvider); // Act var template = new Template("test", "test"); @@ -153,19 +142,17 @@ namespace Umbraco.Tests.Persistence.Repositories //Assert Assert.That(repository.Get("test"), Is.Not.Null); - Assert.That(_viewsFileSystem.FileExists("test.cshtml"), Is.True); + Assert.That(_fileSystems.MvcViewsFileSystem.FileExists("test.cshtml"), Is.True); } - } [Test] public void Can_Perform_Add_View_With_Default_Content() { // Arrange - var provider = TestObjects.GetScopeProvider(Logger); - using (var scope = ScopeProvider.CreateScope()) + using (ScopeProvider.CreateScope()) { - var repository = CreateRepository(provider); + var repository = CreateRepository(ScopeProvider); // Act var template = new Template("test", "test") @@ -173,41 +160,36 @@ namespace Umbraco.Tests.Persistence.Repositories Content = ViewHelper.GetDefaultFileContent() }; repository.Save(template); - //Assert Assert.That(repository.Get("test"), Is.Not.Null); - Assert.That(_viewsFileSystem.FileExists("test.cshtml"), Is.True); + Assert.That(_fileSystems.MvcViewsFileSystem.FileExists("test.cshtml"), Is.True); Assert.AreEqual( @"@inherits Umbraco.Web.Mvc.UmbracoViewPage @{ Layout = null;}".StripWhitespace(), template.Content.StripWhitespace()); } - } [Test] public void Can_Perform_Add_View_With_Default_Content_With_Parent() { // Arrange - var provider = TestObjects.GetScopeProvider(Logger); - using (var scope = ScopeProvider.CreateScope()) + using (ScopeProvider.CreateScope()) { - var repository = CreateRepository(provider); + var repository = CreateRepository(ScopeProvider); //NOTE: This has to be persisted first var template = new Template("test", "test"); repository.Save(template); - // Act var template2 = new Template("test2", "test2"); template2.SetMasterTemplate(template); repository.Save(template2); - //Assert Assert.That(repository.Get("test2"), Is.Not.Null); - Assert.That(_viewsFileSystem.FileExists("test2.cshtml"), Is.True); + Assert.That(_fileSystems.MvcViewsFileSystem.FileExists("test2.cshtml"), Is.True); Assert.AreEqual( "@inherits Umbraco.Web.Mvc.UmbracoViewPage @{ Layout = \"test.cshtml\";}".StripWhitespace(), template2.Content.StripWhitespace()); @@ -218,10 +200,9 @@ namespace Umbraco.Tests.Persistence.Repositories public void Can_Perform_Add_Unique_Alias() { // Arrange - var provider = TestObjects.GetScopeProvider(Logger); - using (var scope = ScopeProvider.CreateScope()) + using (ScopeProvider.CreateScope()) { - var repository = CreateRepository(provider); + var repository = CreateRepository(ScopeProvider); // Act var template = new Template("test", "test") @@ -229,29 +210,25 @@ namespace Umbraco.Tests.Persistence.Repositories Content = ViewHelper.GetDefaultFileContent() }; repository.Save(template); - var template2 = new Template("test", "test") { Content = ViewHelper.GetDefaultFileContent() }; repository.Save(template2); - //Assert Assert.AreEqual("test1", template2.Alias); } - } [Test] public void Can_Perform_Update_Unique_Alias() { // Arrange - var provider = TestObjects.GetScopeProvider(Logger); - using (var scope = ScopeProvider.CreateScope()) + using (ScopeProvider.CreateScope()) { - var repository = CreateRepository(provider); + var repository = CreateRepository(ScopeProvider); // Act var template = new Template("test", "test") @@ -259,35 +236,30 @@ namespace Umbraco.Tests.Persistence.Repositories Content = ViewHelper.GetDefaultFileContent() }; repository.Save(template); - var template2 = new Template("test1", "test1") { Content = ViewHelper.GetDefaultFileContent() }; repository.Save(template2); - template.Alias = "test1"; repository.Save(template); - //Assert Assert.AreEqual("test11", template.Alias); - Assert.That(_viewsFileSystem.FileExists("test11.cshtml"), Is.True); - Assert.That(_viewsFileSystem.FileExists("test.cshtml"), Is.False); + Assert.That(_fileSystems.MvcViewsFileSystem.FileExists("test11.cshtml"), Is.True); + Assert.That(_fileSystems.MvcViewsFileSystem.FileExists("test.cshtml"), Is.False); } - } [Test] public void Can_Perform_Update_MasterPage() { // Arrange - var provider = TestObjects.GetScopeProvider(Logger); - using (var scope = ScopeProvider.CreateScope()) + using (ScopeProvider.CreateScope()) { - var repository = CreateRepository(provider); + var repository = CreateRepository(ScopeProvider); // Act var template = new Template("test", "test") @@ -295,30 +267,25 @@ namespace Umbraco.Tests.Persistence.Repositories Content = @"<%@ Master Language=""C#"" %>" }; repository.Save(template); - template.Content = @"<%@ Master Language=""VB"" %>"; repository.Save(template); - var updated = repository.Get("test"); // Assert - Assert.That(_masterPageFileSystem.FileExists("test.master"), Is.True); + Assert.That(_fileSystems.MasterPagesFileSystem.FileExists("test.master"), Is.True); Assert.That(updated.Content, Is.EqualTo(@"<%@ Master Language=""VB"" %>")); } - - } [Test] public void Can_Perform_Update_View() { // Arrange - var provider = TestObjects.GetScopeProvider(Logger); - using (var scope = ScopeProvider.CreateScope()) + using (ScopeProvider.CreateScope()) { - var repository = CreateRepository(provider); + var repository = CreateRepository(ScopeProvider); // Act var template = new Template("test", "test") @@ -326,16 +293,14 @@ namespace Umbraco.Tests.Persistence.Repositories Content = ViewHelper.GetDefaultFileContent() }; repository.Save(template); - template.Content += ""; repository.Save(template); - var updated = repository.Get("test"); // Assert - Assert.That(_viewsFileSystem.FileExists("test.cshtml"), Is.True); + Assert.That(_fileSystems.MvcViewsFileSystem.FileExists("test.cshtml"), Is.True); Assert.That(updated.Content, Is.EqualTo(ViewHelper.GetDefaultFileContent() + "")); } } @@ -344,27 +309,24 @@ namespace Umbraco.Tests.Persistence.Repositories public void Can_Perform_Delete_MasterPage() { // Arrange - var provider = TestObjects.GetScopeProvider(Logger); - using (var scope = ScopeProvider.CreateScope()) + using (ScopeProvider.CreateScope()) { - var repository = CreateRepository(provider); + var repository = CreateRepository(ScopeProvider); var template = new Template("test", "test") { Content = @"<%@ Master Language=""C#"" %>" }; repository.Save(template); - // Act var templates = repository.Get("test"); - Assert.That(_masterPageFileSystem.FileExists("test.master"), Is.True); + Assert.That(_fileSystems.MasterPagesFileSystem.FileExists("test.master"), Is.True); repository.Delete(templates); - // Assert Assert.IsNull(repository.Get("test")); - Assert.That(_masterPageFileSystem.FileExists("test.master"), Is.False); + Assert.That(_fileSystems.MasterPagesFileSystem.FileExists("test.master"), Is.False); } } @@ -372,27 +334,24 @@ namespace Umbraco.Tests.Persistence.Repositories public void Can_Perform_Delete_View() { // Arrange - var provider = TestObjects.GetScopeProvider(Logger); - using (var scope = ScopeProvider.CreateScope()) + using (ScopeProvider.CreateScope()) { - var repository = CreateRepository(provider); + var repository = CreateRepository(ScopeProvider); var template = new Template("test", "test") { Content = ViewHelper.GetDefaultFileContent() }; repository.Save(template); - // Act var templates = repository.Get("test"); - Assert.That(_viewsFileSystem.FileExists("test.cshtml"), Is.True); + Assert.That(_fileSystems.MvcViewsFileSystem.FileExists("test.cshtml"), Is.True); repository.Delete(templates); - // Assert Assert.IsNull(repository.Get("test")); - Assert.That(_viewsFileSystem.FileExists("test.cshtml"), Is.False); + Assert.That(_fileSystems.MvcViewsFileSystem.FileExists("test.cshtml"), Is.False); } } @@ -400,39 +359,33 @@ namespace Umbraco.Tests.Persistence.Repositories public void Can_Perform_Delete_When_Assigned_To_Doc() { // Arrange - var provider = TestObjects.GetScopeProvider(Logger); - using (var scope = ScopeProvider.CreateScope()) + using (ScopeProvider.CreateScope()) { - var templateRepository = CreateRepository(provider); + var templateRepository = CreateRepository(ScopeProvider); - var tagRepository = new TagRepository((IScopeAccessor) provider, CacheHelper.Disabled, Logger); - var contentTypeRepository = new ContentTypeRepository((IScopeAccessor) provider, CacheHelper.Disabled, Logger, templateRepository); - var languageRepository = new LanguageRepository((IScopeAccessor) provider, CacheHelper.Disabled, Logger); - var contentRepo = new DocumentRepository((IScopeAccessor) provider, CacheHelper.Disabled, Logger, contentTypeRepository, templateRepository, tagRepository, languageRepository, Mock.Of()); + var tagRepository = new TagRepository((IScopeAccessor) ScopeProvider, CacheHelper.Disabled, Logger); + var contentTypeRepository = new ContentTypeRepository((IScopeAccessor) ScopeProvider, CacheHelper.Disabled, Logger, templateRepository); + var languageRepository = new LanguageRepository((IScopeAccessor) ScopeProvider, CacheHelper.Disabled, Logger); + var contentRepo = new DocumentRepository((IScopeAccessor) ScopeProvider, CacheHelper.Disabled, Logger, contentTypeRepository, templateRepository, tagRepository, languageRepository, Mock.Of()); var contentType = MockedContentTypes.CreateSimpleContentType("umbTextpage2", "Textpage"); ServiceContext.FileService.SaveTemplate(contentType.DefaultTemplate); // else, FK violation on contentType! contentTypeRepository.Save(contentType); var textpage = MockedContent.CreateSimpleContent(contentType); contentRepo.Save(textpage); - - var template = new Template("test", "test") { Content = @"<%@ Master Language=""C#"" %>" }; templateRepository.Save(template); - textpage.Template = template; contentRepo.Save(textpage); - // Act var templates = templateRepository.Get("test"); templateRepository.Delete(templates); - // Assert Assert.IsNull(templateRepository.Get("test")); @@ -443,10 +396,9 @@ namespace Umbraco.Tests.Persistence.Repositories public void Can_Perform_Delete_On_Nested_Templates() { // Arrange - var provider = TestObjects.GetScopeProvider(Logger); - using (var scope = ScopeProvider.CreateScope()) + using (ScopeProvider.CreateScope()) { - var repository = CreateRepository(provider); + var repository = CreateRepository(ScopeProvider); var parent = new Template("parent", "parent") { @@ -467,12 +419,10 @@ namespace Umbraco.Tests.Persistence.Repositories repository.Save(parent); repository.Save(child); repository.Save(baby); - // Act var templates = repository.Get("parent"); repository.Delete(templates); - // Assert Assert.IsNull(repository.Get("test")); @@ -483,10 +433,9 @@ namespace Umbraco.Tests.Persistence.Repositories public void Can_Get_Template_Tree() { // Arrange - var provider = TestObjects.GetScopeProvider(Logger); - using (var scope = ScopeProvider.CreateScope()) + using (ScopeProvider.CreateScope()) { - var repository = CreateRepository(provider); + var repository = CreateRepository(ScopeProvider); CreateHierarchy(repository); @@ -510,10 +459,9 @@ namespace Umbraco.Tests.Persistence.Repositories public void Can_Get_All() { // Arrange - var provider = TestObjects.GetScopeProvider(Logger); - using (var scope = ScopeProvider.CreateScope()) + using (ScopeProvider.CreateScope()) { - var repository = CreateRepository(provider); + var repository = CreateRepository(ScopeProvider); var created = CreateHierarchy(repository).ToArray(); @@ -538,10 +486,9 @@ namespace Umbraco.Tests.Persistence.Repositories public void Can_Get_Children() { // Arrange - var provider = TestObjects.GetScopeProvider(Logger); - using (var scope = ScopeProvider.CreateScope()) + using (ScopeProvider.CreateScope()) { - var repository = CreateRepository(provider); + var repository = CreateRepository(ScopeProvider); var created = CreateHierarchy(repository).ToArray(); @@ -549,7 +496,6 @@ namespace Umbraco.Tests.Persistence.Repositories var childrenById = repository.GetChildren(created[1].Id); var childrenByAlias = repository.GetChildren(created[1].Alias); - // Assert Assert.AreEqual(2, childrenById.Count()); Assert.AreEqual(2, childrenById.DistinctBy(x => x.Id).Count()); @@ -562,17 +508,15 @@ namespace Umbraco.Tests.Persistence.Repositories public void Can_Get_Children_At_Root() { // Arrange - var provider = TestObjects.GetScopeProvider(Logger); - using (var scope = ScopeProvider.CreateScope()) + using (ScopeProvider.CreateScope()) { - var repository = CreateRepository(provider); + var repository = CreateRepository(ScopeProvider); CreateHierarchy(repository).ToArray(); // Act var children = repository.GetChildren(-1); - // Assert Assert.AreEqual(1, children.Count()); Assert.AreEqual(1, children.DistinctBy(x => x.Id).Count()); @@ -583,18 +527,15 @@ namespace Umbraco.Tests.Persistence.Repositories public void Can_Get_Descendants() { // Arrange - var provider = TestObjects.GetScopeProvider(Logger); - using (var scope = ScopeProvider.CreateScope()) + using (ScopeProvider.CreateScope()) { - var repository = CreateRepository(provider); - + var repository = CreateRepository(ScopeProvider); var created = CreateHierarchy(repository).ToArray(); // Act var descendantsById = repository.GetDescendants(created[1].Id); var descendantsByAlias = repository.GetDescendants(created[1].Alias); - // Assert Assert.AreEqual(3, descendantsById.Count()); Assert.AreEqual(3, descendantsById.DistinctBy(x => x.Id).Count()); @@ -608,10 +549,9 @@ namespace Umbraco.Tests.Persistence.Repositories public void Path_Is_Set_Correctly_On_Creation() { // Arrange - var provider = TestObjects.GetScopeProvider(Logger); - using (var scope = ScopeProvider.CreateScope()) + using (ScopeProvider.CreateScope()) { - var repository = CreateRepository(provider); + var repository = CreateRepository(ScopeProvider); var parent = new Template("parent", "parent"); var child1 = new Template("child1", "child1"); @@ -640,7 +580,6 @@ namespace Umbraco.Tests.Persistence.Repositories baby2.MasterTemplateAlias = toddler4.Alias; baby2.MasterTemplateId = new Lazy(() => toddler4.Id); - // Act repository.Save(parent); repository.Save(child1); @@ -651,7 +590,6 @@ namespace Umbraco.Tests.Persistence.Repositories repository.Save(toddler4); repository.Save(baby1); repository.Save(baby2); - // Assert Assert.AreEqual(string.Format("-1,{0}", parent.Id), parent.Path); @@ -671,10 +609,9 @@ namespace Umbraco.Tests.Persistence.Repositories public void Path_Is_Set_Correctly_On_Update() { // Arrange - var provider = TestObjects.GetScopeProvider(Logger); - using (var scope = ScopeProvider.CreateScope()) + using (ScopeProvider.CreateScope()) { - var repository = CreateRepository(provider); + var repository = CreateRepository(ScopeProvider); var parent = new Template("parent", "parent"); var child1 = new Template("child1", "child1"); @@ -696,12 +633,10 @@ namespace Umbraco.Tests.Persistence.Repositories repository.Save(child2); repository.Save(toddler1); repository.Save(toddler2); - //Act toddler2.SetMasterTemplate(child2); repository.Save(toddler2); - //Assert Assert.AreEqual($"-1,{parent.Id},{child2.Id},{toddler2.Id}", toddler2.Path); @@ -712,10 +647,9 @@ namespace Umbraco.Tests.Persistence.Repositories public void Path_Is_Set_Correctly_On_Update_With_Master_Template_Removal() { // Arrange - var provider = TestObjects.GetScopeProvider(Logger); - using (var scope = ScopeProvider.CreateScope()) + using (ScopeProvider.CreateScope()) { - var repository = CreateRepository(provider); + var repository = CreateRepository(ScopeProvider); var parent = new Template("parent", "parent"); var child1 = new Template("child1", "child1"); @@ -725,12 +659,10 @@ namespace Umbraco.Tests.Persistence.Repositories repository.Save(parent); repository.Save(child1); - //Act child1.SetMasterTemplate(null); repository.Save(child1); - //Assert Assert.AreEqual($"-1,{child1.Id}", child1.Path); @@ -742,21 +674,18 @@ namespace Umbraco.Tests.Persistence.Repositories { base.TearDown(); - _masterPageFileSystem = null; - _viewsFileSystem = null; + _fileSystems = null; + //Delete all files var fsMaster = new PhysicalFileSystem(SystemDirectories.Masterpages); var masterPages = fsMaster.GetFiles("", "*.master"); foreach (var file in masterPages) - { fsMaster.DeleteFile(file); - } + var fsViews = new PhysicalFileSystem(SystemDirectories.MvcViews); - var views = fsMaster.GetFiles("", "*.cshtml"); + var views = fsViews.GetFiles("", "*.cshtml"); foreach (var file in views) - { - fsMaster.DeleteFile(file); - } + fsViews.DeleteFile(file); } protected Stream CreateStream(string contents = null) diff --git a/src/Umbraco.Tests/Persistence/Repositories/UserRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/UserRepositoryTest.cs index 5a46bc805f..64615c1950 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/UserRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/UserRepositoryTest.cs @@ -39,7 +39,7 @@ namespace Umbraco.Tests.Persistence.Repositories private DocumentRepository CreateContentRepository(IScopeProvider provider, out IContentTypeRepository contentTypeRepository, out ITemplateRepository templateRepository) { var accessor = (IScopeAccessor) provider; - templateRepository = new TemplateRepository(accessor, CacheHelper, Logger, Mock.Of(), Mock.Of(), Mock.Of()); + templateRepository = new TemplateRepository(accessor, CacheHelper, Logger, Mock.Of(), TestObjects.GetFileSystemsMock()); var tagRepository = new TagRepository(accessor, CacheHelper, Logger); contentTypeRepository = new ContentTypeRepository(accessor, CacheHelper, Logger, templateRepository); var languageRepository = new LanguageRepository(accessor, CacheHelper, Logger); diff --git a/src/Umbraco.Tests/Scoping/ScopeEventDispatcherTests.cs b/src/Umbraco.Tests/Scoping/ScopeEventDispatcherTests.cs index ecb8e42c90..b270fe8e22 100644 --- a/src/Umbraco.Tests/Scoping/ScopeEventDispatcherTests.cs +++ b/src/Umbraco.Tests/Scoping/ScopeEventDispatcherTests.cs @@ -1,10 +1,9 @@ using System; -using System.Collections.Generic; using System.Linq; using LightInject; using Moq; using NUnit.Framework; -using Umbraco.Core.Collections; +using Umbraco.Core; using Umbraco.Core.Events; using Umbraco.Core.Models; using Umbraco.Core.IO; diff --git a/src/Umbraco.Tests/Scoping/ScopedXmlTests.cs b/src/Umbraco.Tests/Scoping/ScopedXmlTests.cs index 5f4e653735..948b0f6378 100644 --- a/src/Umbraco.Tests/Scoping/ScopedXmlTests.cs +++ b/src/Umbraco.Tests/Scoping/ScopedXmlTests.cs @@ -4,6 +4,7 @@ using System.Xml; using Moq; using NUnit.Framework; using LightInject; +using Umbraco.Core; using Umbraco.Core.Cache; using Umbraco.Core.Composing; using Umbraco.Core.Events; diff --git a/src/Umbraco.Tests/Services/ContentServicePerformanceTest.cs b/src/Umbraco.Tests/Services/ContentServicePerformanceTest.cs index b1d6934043..5f41031a0b 100644 --- a/src/Umbraco.Tests/Services/ContentServicePerformanceTest.cs +++ b/src/Umbraco.Tests/Services/ContentServicePerformanceTest.cs @@ -162,7 +162,7 @@ namespace Umbraco.Tests.Services var provider = TestObjects.GetScopeProvider(Logger); using (var scope = provider.CreateScope()) { - var tRepository = new TemplateRepository((IScopeAccessor) provider, CacheHelper.Disabled, Logger, Mock.Of(), Mock.Of(), Mock.Of()); + var tRepository = new TemplateRepository((IScopeAccessor) provider, CacheHelper.Disabled, Logger, Mock.Of(), TestObjects.GetFileSystemsMock()); var tagRepo = new TagRepository((IScopeAccessor) provider, CacheHelper.Disabled, Logger); var ctRepository = new ContentTypeRepository((IScopeAccessor) provider, CacheHelper.Disabled, Logger, tRepository); var languageRepository = new LanguageRepository((IScopeAccessor) provider, CacheHelper.Disabled, Logger); @@ -195,7 +195,7 @@ namespace Umbraco.Tests.Services var provider = TestObjects.GetScopeProvider(Logger); using (var scope = provider.CreateScope()) { - var tRepository = new TemplateRepository((IScopeAccessor) provider, CacheHelper.Disabled, Logger, Mock.Of(), Mock.Of(), Mock.Of()); + var tRepository = new TemplateRepository((IScopeAccessor) provider, CacheHelper.Disabled, Logger, Mock.Of(), TestObjects.GetFileSystemsMock()); var tagRepo = new TagRepository((IScopeAccessor) provider, CacheHelper.Disabled, Logger); var ctRepository = new ContentTypeRepository((IScopeAccessor) provider, CacheHelper.Disabled, Logger, tRepository); var languageRepository = new LanguageRepository((IScopeAccessor) provider, CacheHelper.Disabled, Logger); @@ -226,7 +226,7 @@ namespace Umbraco.Tests.Services var provider = TestObjects.GetScopeProvider(Logger); using (var scope = provider.CreateScope()) { - var tRepository = new TemplateRepository((IScopeAccessor) provider, CacheHelper.Disabled, Logger, Mock.Of(), Mock.Of(), Mock.Of()); + var tRepository = new TemplateRepository((IScopeAccessor) provider, CacheHelper.Disabled, Logger, Mock.Of(), TestObjects.GetFileSystemsMock()); var tagRepo = new TagRepository((IScopeAccessor) provider, CacheHelper.Disabled, Logger); var ctRepository = new ContentTypeRepository((IScopeAccessor) provider, CacheHelper.Disabled, Logger, tRepository); var languageRepository = new LanguageRepository((IScopeAccessor) provider, CacheHelper.Disabled, Logger); @@ -260,7 +260,7 @@ namespace Umbraco.Tests.Services var provider = TestObjects.GetScopeProvider(Logger); using (var scope = provider.CreateScope()) { - var tRepository = new TemplateRepository((IScopeAccessor) provider, CacheHelper.Disabled, Logger, Mock.Of(), Mock.Of(), Mock.Of()); + var tRepository = new TemplateRepository((IScopeAccessor) provider, CacheHelper.Disabled, Logger, Mock.Of(), TestObjects.GetFileSystemsMock()); var tagRepo = new TagRepository((IScopeAccessor) provider, CacheHelper.Disabled, Logger); var ctRepository = new ContentTypeRepository((IScopeAccessor) provider, CacheHelper.Disabled, Logger, tRepository); var languageRepository = new LanguageRepository((IScopeAccessor) provider, CacheHelper.Disabled, Logger); diff --git a/src/Umbraco.Tests/Services/ContentServiceTests.cs b/src/Umbraco.Tests/Services/ContentServiceTests.cs index c3661c1a18..ff1678fa3f 100644 --- a/src/Umbraco.Tests/Services/ContentServiceTests.cs +++ b/src/Umbraco.Tests/Services/ContentServiceTests.cs @@ -2952,7 +2952,7 @@ namespace Umbraco.Tests.Services private DocumentRepository CreateRepository(IScopeProvider provider, out ContentTypeRepository contentTypeRepository) { var accessor = (IScopeAccessor) provider; - var templateRepository = new TemplateRepository(accessor, CacheHelper.Disabled, Logger, Mock.Of(), Mock.Of(), Mock.Of()); + var templateRepository = new TemplateRepository(accessor, CacheHelper.Disabled, Logger, Mock.Of(), TestObjects.GetFileSystemsMock()); var tagRepository = new TagRepository(accessor, CacheHelper.Disabled, Logger); contentTypeRepository = new ContentTypeRepository(accessor, CacheHelper.Disabled, Logger, templateRepository); var languageRepository = new LanguageRepository(accessor, CacheHelper.Disabled, Logger); diff --git a/src/Umbraco.Tests/Templates/TemplateRepositoryTests.cs b/src/Umbraco.Tests/Templates/TemplateRepositoryTests.cs index 340f0ea79f..795d79ced1 100644 --- a/src/Umbraco.Tests/Templates/TemplateRepositoryTests.cs +++ b/src/Umbraco.Tests/Templates/TemplateRepositoryTests.cs @@ -6,9 +6,6 @@ using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Models; -using Umbraco.Core.Persistence; -using Umbraco.Core.Persistence.Querying; -using Umbraco.Core.Persistence.Repositories; using Umbraco.Core.Persistence.Repositories.Implement; using Umbraco.Core.Scoping; using Umbraco.Tests.TestHelpers; @@ -19,12 +16,11 @@ namespace Umbraco.Tests.Templates public class TemplateRepositoryTests { private readonly Mock _cacheMock = new Mock(); - private readonly Mock _viewFileSystemMock = new Mock(); - private readonly Mock _masterpageFileSystemMock = new Mock(); private readonly Mock _templateConfigMock = new Mock(); + private readonly IFileSystems _fileSystems = Mock.Of(); private TemplateRepository _templateRepository; - private readonly TestObjects TestObjects = new TestObjects(null); + private readonly TestObjects _testObjects = new TestObjects(null); [SetUp] public void Setup() @@ -33,12 +29,16 @@ namespace Umbraco.Tests.Templates var accessorMock = new Mock(); var scopeMock = new Mock(); - var database = TestObjects.GetUmbracoSqlCeDatabase(logger); + var database = _testObjects.GetUmbracoSqlCeDatabase(logger); scopeMock.Setup(x => x.Database).Returns(database); accessorMock.Setup(x => x.AmbientScope).Returns(scopeMock.Object); - _templateRepository = new TemplateRepository(accessorMock.Object, _cacheMock.Object, logger, _templateConfigMock.Object, _masterpageFileSystemMock.Object, _viewFileSystemMock.Object); + var mvcFs = Mock.Of(); + var masterFs = Mock.Of(); + Mock.Get(_fileSystems).Setup(x => x.MvcViewsFileSystem).Returns(mvcFs); + Mock.Get(_fileSystems).Setup(x => x.MasterPagesFileSystem).Returns(masterFs); + _templateRepository = new TemplateRepository(accessorMock.Object, _cacheMock.Object, logger, _templateConfigMock.Object, _fileSystems); } [Test] @@ -53,7 +53,8 @@ namespace Umbraco.Tests.Templates templateMock.Setup(x => x.Content).Returns(""); // but MVC View already exists - _viewFileSystemMock.Setup(x => x.FileExists(It.IsAny())).Returns(true); + Mock.Get(_fileSystems.MvcViewsFileSystem) + .Setup(x => x.FileExists(It.IsAny())).Returns(true); var res = _templateRepository.DetermineTemplateRenderingEngine(templateMock.Object); Assert.AreEqual(RenderingEngine.Mvc, res); @@ -71,7 +72,8 @@ namespace Umbraco.Tests.Templates templateMock.Setup(x => x.Content).Returns(""); // MVC View doesn't exist - _viewFileSystemMock.Setup(x => x.FileExists(It.IsAny())).Returns(false); + Mock.Get(_fileSystems.MvcViewsFileSystem) + .Setup(x => x.FileExists(It.IsAny())).Returns(false); var res = _templateRepository.DetermineTemplateRenderingEngine(templateMock.Object); Assert.AreEqual(RenderingEngine.WebForms, res); @@ -87,8 +89,10 @@ namespace Umbraco.Tests.Templates templateMock.Setup(x => x.Alias).Returns("Something"); // but masterpage already exists - _viewFileSystemMock.Setup(x => x.FileExists(It.IsAny())).Returns(false); - _masterpageFileSystemMock.Setup(x => x.FileExists(It.IsAny())).Returns(true); + Mock.Get(_fileSystems.MvcViewsFileSystem) + .Setup(x => x.FileExists(It.IsAny())).Returns(false); + Mock.Get(_fileSystems.MasterPagesFileSystem) + .Setup(x => x.FileExists(It.IsAny())).Returns(true); var res = _templateRepository.DetermineTemplateRenderingEngine(templateMock.Object); Assert.AreEqual(RenderingEngine.WebForms, res); @@ -104,8 +108,10 @@ namespace Umbraco.Tests.Templates templateMock.Setup(x => x.Alias).Returns("Something"); // but MVC View already exists - _viewFileSystemMock.Setup(x => x.FileExists(It.IsAny())).Returns(true); - _masterpageFileSystemMock.Setup(x => x.FileExists(It.IsAny())).Returns(false); + Mock.Get(_fileSystems.MvcViewsFileSystem) + .Setup(x => x.FileExists(It.IsAny())).Returns(true); + Mock.Get(_fileSystems.MasterPagesFileSystem) + .Setup(x => x.FileExists(It.IsAny())).Returns(false); var res = _templateRepository.DetermineTemplateRenderingEngine(templateMock.Object); Assert.AreEqual(RenderingEngine.Mvc, res); diff --git a/src/Umbraco.Tests/TestHelpers/TestObjects-Mocks.cs b/src/Umbraco.Tests/TestHelpers/TestObjects-Mocks.cs index 6750ad9792..1cf39532a2 100644 --- a/src/Umbraco.Tests/TestHelpers/TestObjects-Mocks.cs +++ b/src/Umbraco.Tests/TestHelpers/TestObjects-Mocks.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Data; using System.Data.Common; using System.Linq; +using System.Linq.Expressions; using System.Web; using LightInject; using Moq; @@ -10,6 +11,7 @@ using Umbraco.Core; using Umbraco.Core.Configuration; using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.Events; +using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Persistence; @@ -140,6 +142,24 @@ namespace Umbraco.Tests.TestHelpers return SettingsForTests.GetDefaultGlobalSettings(); } + public IFileSystems GetFileSystemsMock() + { + var fileSystems = Mock.Of(); + MockFs(fileSystems, x => x.MasterPagesFileSystem); + MockFs(fileSystems, x => x.MacroPartialsFileSystem); + MockFs(fileSystems, x => x.MvcViewsFileSystem); + MockFs(fileSystems, x => x.PartialViewsFileSystem); + MockFs(fileSystems, x => x.ScriptsFileSystem); + MockFs(fileSystems, x => x.StylesheetsFileSystem); + return fileSystems; + } + + private void MockFs(IFileSystems fileSystems, Expression> fileSystem) + { + var fs = Mock.Of(); + Mock.Get(fileSystems).Setup(fileSystem).Returns(fs); + } + #region Inner classes private class MockDbConnection : DbConnection diff --git a/src/Umbraco.Tests/Testing/UmbracoTestBase.cs b/src/Umbraco.Tests/Testing/UmbracoTestBase.cs index ef2ba7133e..1b839a642e 100644 --- a/src/Umbraco.Tests/Testing/UmbracoTestBase.cs +++ b/src/Umbraco.Tests/Testing/UmbracoTestBase.cs @@ -11,7 +11,7 @@ using Umbraco.Core; using Umbraco.Core.Cache; using Umbraco.Core.Components; using Umbraco.Core.Composing; -using Umbraco.Core.Composing.CompositionRoots; +using Umbraco.Core.Composing.Composers; using Umbraco.Core.Configuration; using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.Events; @@ -22,7 +22,6 @@ using Umbraco.Core.Manifest; using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.Mappers; -using Umbraco.Core.Persistence.Querying; using Umbraco.Core.Persistence.Repositories.Implement; using Umbraco.Core.Persistence.SqlSyntax; using Umbraco.Core.PropertyEditors; @@ -34,9 +33,8 @@ using Umbraco.Tests.TestHelpers; using Umbraco.Tests.TestHelpers.Stubs; using Umbraco.Web; using Umbraco.Web.Services; -using Umbraco.Examine; using Umbraco.Tests.Testing.Objects.Accessors; -using Umbraco.Web.Composing.CompositionRoots; +using Umbraco.Web.Composing.Composers; using Umbraco.Web._Legacy.Actions; using Current = Umbraco.Core.Composing.Current; using Umbraco.Web.Routing; @@ -218,8 +216,8 @@ namespace Umbraco.Tests.Testing { if (configure == false) return; - Container.RegisterFrom(); - Container.RegisterFrom(); + Container.ComposeCoreMappingProfiles(); + Container.ComposeWebMappingProfiles(); } protected virtual void ComposePluginManager(UmbracoTestOptions.PluginManager pluginManager) @@ -278,7 +276,7 @@ namespace Umbraco.Tests.Testing SettingsForTests.ConfigureSettings(globalSettings); // default Datalayer/Repositories/SQL/Database/etc... - Container.RegisterFrom(); + Container.ComposeRepositories(); // register basic stuff that might need to be there for some container resolvers to work Container.RegisterSingleton(factory => umbracoSettings); @@ -325,11 +323,13 @@ namespace Umbraco.Tests.Testing Container.RegisterCollectionBuilder(); // empty Container.RegisterSingleton(factory => new FileSystems(factory.TryGetInstance())); + Container.RegisterSingleton(factory => factory.GetInstance()); Container.RegisterSingleton(factory => TestObjects.GetScopeProvider(factory.TryGetInstance(), factory.TryGetInstance(), factory.TryGetInstance())); Container.RegisterSingleton(factory => (IScopeAccessor) factory.GetInstance()); - Container.RegisterFrom(); + Container.ComposeServices(); + // composition root is doing weird things, fix Container.RegisterSingleton(); Container.RegisterSingleton(); diff --git a/src/Umbraco.Web/Cache/CacheRefresherComponent.cs b/src/Umbraco.Web/Cache/CacheRefresherComponent.cs index 2ee0ff5f84..591a54f611 100644 --- a/src/Umbraco.Web/Cache/CacheRefresherComponent.cs +++ b/src/Umbraco.Web/Cache/CacheRefresherComponent.cs @@ -20,7 +20,6 @@ using Umbraco.Core.Services.Implement; using Umbraco.Web.Composing; using Umbraco.Web.Security; using Umbraco.Web.Services; -using LightInject; using ApplicationTree = Umbraco.Core.Models.ApplicationTree; namespace Umbraco.Web.Cache diff --git a/src/Umbraco.Web/Composing/CompositionRoots/InstallerCompositionRoot.cs b/src/Umbraco.Web/Composing/Composers/InstallerComposer.cs similarity index 64% rename from src/Umbraco.Web/Composing/CompositionRoots/InstallerCompositionRoot.cs rename to src/Umbraco.Web/Composing/Composers/InstallerComposer.cs index b4f7d435f4..265272cef2 100644 --- a/src/Umbraco.Web/Composing/CompositionRoots/InstallerCompositionRoot.cs +++ b/src/Umbraco.Web/Composing/Composers/InstallerComposer.cs @@ -1,20 +1,16 @@ using LightInject; using Umbraco.Web.Install; -using Umbraco.Web.Install.Controllers; using Umbraco.Web.Install.InstallSteps; using Umbraco.Web.Install.Models; -namespace Umbraco.Web.Composing.CompositionRoots +namespace Umbraco.Web.Composing.Composers { - /// - /// A composition root for dealing with the installer and installer steps - /// - public sealed class InstallerCompositionRoot : ICompositionRoot + public static class InstallerComposer { - public void Compose(IServiceRegistry container) + public static IServiceRegistry ComposeInstaller(this IServiceRegistry registry) { //register the installer steps in order - container.RegisterOrdered(typeof(InstallSetupStep), + registry.RegisterOrdered(typeof(InstallSetupStep), new[] { typeof(NewInstallStep), @@ -33,10 +29,10 @@ namespace Umbraco.Web.Composing.CompositionRoots typeof(SetUmbracoVersionStep) }, type => new PerScopeLifetime()); - container.Register(); - container.Register(); - - + registry.Register(); + registry.Register(); + + return registry; } } } diff --git a/src/Umbraco.Web/Composing/Composers/WebMappingProfilesComposer.cs b/src/Umbraco.Web/Composing/Composers/WebMappingProfilesComposer.cs new file mode 100644 index 0000000000..65fdd7fb72 --- /dev/null +++ b/src/Umbraco.Web/Composing/Composers/WebMappingProfilesComposer.cs @@ -0,0 +1,46 @@ +using LightInject; +using Umbraco.Core.Models; +using Umbraco.Web.Models.ContentEditing; +using Umbraco.Web.Models.Mapping; +using Umbraco.Web.Trees; + +namespace Umbraco.Web.Composing.Composers +{ + public static class WebMappingProfilesComposer + { + public static IServiceRegistry ComposeWebMappingProfiles(this IServiceRegistry registry) + { + //register the profiles + registry.Register(); + registry.Register(); + registry.Register(); + registry.Register(); + registry.Register(); + registry.Register(); + registry.Register(); + registry.Register(); + registry.Register(); + registry.Register(); + registry.Register(); + registry.Register(); + registry.Register(); + registry.Register(); + registry.Register(); + registry.Register(); + registry.Register(); + registry.Register(); + + //register any resolvers, etc.. that the profiles use + registry.Register(); + registry.Register>(); + registry.Register>(); + registry.Register>(); + registry.Register>(); + registry.Register(); + registry.Register(); + registry.Register(); + + return registry; + } + } +} diff --git a/src/Umbraco.Web/Composing/CompositionRoots/HelperCompositionRoot.cs b/src/Umbraco.Web/Composing/CompositionRoots/HelperCompositionRoot.cs deleted file mode 100644 index d708493016..0000000000 --- a/src/Umbraco.Web/Composing/CompositionRoots/HelperCompositionRoot.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.Web.Security; -using LightInject; -using Umbraco.Web.Security; -using Umbraco.Web.Security.Providers; - -namespace Umbraco.Web.Composing.CompositionRoots -{ - public class HelperCompositionRoot : ICompositionRoot - { - public void Compose(IServiceRegistry container) - { - container.Register((factory) => Core.Security.MembershipProviderExtensions.GetMembersMembershipProvider()); - container.Register((factory) => Roles.Enabled ? Roles.Provider : new MembersRoleProvider(Core.Composing.Current.Services.MemberService)); - container.Register(); - } - } -} diff --git a/src/Umbraco.Web/Composing/CompositionRoots/WebMappingProfilesCompositionRoot.cs b/src/Umbraco.Web/Composing/CompositionRoots/WebMappingProfilesCompositionRoot.cs deleted file mode 100644 index e865019790..0000000000 --- a/src/Umbraco.Web/Composing/CompositionRoots/WebMappingProfilesCompositionRoot.cs +++ /dev/null @@ -1,44 +0,0 @@ -using LightInject; -using Umbraco.Core.Models; -using Umbraco.Web.Models.ContentEditing; -using Umbraco.Web.Models.Mapping; -using Umbraco.Web.Trees; - -namespace Umbraco.Web.Composing.CompositionRoots -{ - public sealed class WebMappingProfilesCompositionRoot : ICompositionRoot - { - public void Compose(IServiceRegistry container) - { - //register the profiles - container.Register(); - container.Register(); - container.Register(); - container.Register(); - container.Register(); - container.Register(); - container.Register(); - container.Register(); - container.Register(); - container.Register(); - container.Register(); - container.Register(); - container.Register(); - container.Register(); - container.Register(); - container.Register(); - container.Register(); - container.Register(); - - //register any resolvers, etc.. that the profiles use - container.Register(); - container.Register>(); - container.Register>(); - container.Register>(); - container.Register>(); - container.Register(); - container.Register(); - container.Register(); - } - } -} diff --git a/src/Umbraco.Web/Composing/Current.cs b/src/Umbraco.Web/Composing/Current.cs index 8c7f4e87ce..f6d8053305 100644 --- a/src/Umbraco.Web/Composing/Current.cs +++ b/src/Umbraco.Web/Composing/Current.cs @@ -241,7 +241,7 @@ namespace Umbraco.Web.Composing public static IScopeProvider ScopeProvider => CoreCurrent.ScopeProvider; - public static FileSystems FileSystems => CoreCurrent.FileSystems; + public static IFileSystems FileSystems => CoreCurrent.FileSystems; public static ISqlContext SqlContext=> CoreCurrent.SqlContext; diff --git a/src/Umbraco.Web/Composing/ModuleInjector.cs b/src/Umbraco.Web/Composing/ModuleInjector.cs index 550cb8efc3..f183cf528e 100644 --- a/src/Umbraco.Web/Composing/ModuleInjector.cs +++ b/src/Umbraco.Web/Composing/ModuleInjector.cs @@ -1,4 +1,5 @@ using System.Web; +using Umbraco.Core; namespace Umbraco.Web.Composing { diff --git a/src/Umbraco.Web/Editors/BackOfficeAssetsController.cs b/src/Umbraco.Web/Editors/BackOfficeAssetsController.cs index eb38957633..8b260bf19a 100644 --- a/src/Umbraco.Web/Editors/BackOfficeAssetsController.cs +++ b/src/Umbraco.Web/Editors/BackOfficeAssetsController.cs @@ -10,19 +10,18 @@ namespace Umbraco.Web.Editors [PluginController("UmbracoApi")] public class BackOfficeAssetsController : UmbracoAuthorizedJsonController { - private readonly FileSystems _fileSystems; + private readonly IFileSystem _jsFileSystem; - public BackOfficeAssetsController(FileSystems fileSystems) + public BackOfficeAssetsController() { - _fileSystems = fileSystems; + _jsFileSystem = new PhysicalFileSystem(SystemDirectories.JavaScriptLibrary); } [HttpGet] public IEnumerable GetSupportedMomentLocales() { const string momentLocaleFolder = "moment"; - var fileSystem = _fileSystems.JavaScriptLibraryFileSystem; - var cultures = fileSystem.GetFiles(momentLocaleFolder, "*.js").ToList(); + var cultures = _jsFileSystem.GetFiles(momentLocaleFolder, "*.js").ToList(); for (var i = 0; i < cultures.Count; i++) { cultures[i] = cultures[i] diff --git a/src/Umbraco.Web/Editors/BackOfficeController.cs b/src/Umbraco.Web/Editors/BackOfficeController.cs index f727c9e2d6..0a4c741bdc 100644 --- a/src/Umbraco.Web/Editors/BackOfficeController.cs +++ b/src/Umbraco.Web/Editors/BackOfficeController.cs @@ -9,12 +9,10 @@ using System.Threading.Tasks; using System.Web; using System.Web.Mvc; using System.Web.UI; -using LightInject; using Microsoft.AspNet.Identity; using Microsoft.AspNet.Identity.Owin; using Microsoft.Owin.Security; using Newtonsoft.Json; -using Newtonsoft.Json.Linq; using Umbraco.Core; using Umbraco.Core.Cache; using Umbraco.Core.Configuration; @@ -22,8 +20,6 @@ using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Manifest; using Umbraco.Core.Models.Identity; -using Umbraco.Core.Models.Membership; -using Umbraco.Core.Persistence; using Umbraco.Core.Security; using Umbraco.Web.Models; using Umbraco.Web.Mvc; diff --git a/src/Umbraco.Web/Editors/TourController.cs b/src/Umbraco.Web/Editors/TourController.cs index 483a910788..5b3c3ab283 100644 --- a/src/Umbraco.Web/Editors/TourController.cs +++ b/src/Umbraco.Web/Editors/TourController.cs @@ -2,8 +2,8 @@ using System.Collections.Generic; using System.IO; using System.Linq; -using LightInject; using Newtonsoft.Json; +using Umbraco.Core; using Umbraco.Core.Composing; using Umbraco.Core.Configuration; using Umbraco.Core.IO; diff --git a/src/Umbraco.Web/HtmlHelperRenderExtensions.cs b/src/Umbraco.Web/HtmlHelperRenderExtensions.cs index 5a4cd97e92..cc625b068c 100644 --- a/src/Umbraco.Web/HtmlHelperRenderExtensions.cs +++ b/src/Umbraco.Web/HtmlHelperRenderExtensions.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.ComponentModel; using System.Linq; using System.Text; using System.Web; @@ -11,12 +10,9 @@ using Umbraco.Core; using Umbraco.Core.Configuration; using Umbraco.Core.Exceptions; using Umbraco.Core.IO; -using Umbraco.Core.Models.PublishedContent; using Umbraco.Web.Composing; -using Umbraco.Web.Models; using Umbraco.Web.Mvc; using Umbraco.Web.Security; -using Constants = Umbraco.Core.Constants; namespace Umbraco.Web { @@ -819,7 +815,7 @@ namespace Umbraco.Web } #endregion - + } } diff --git a/src/Umbraco.Web/Install/InstallHelper.cs b/src/Umbraco.Web/Install/InstallHelper.cs index 00630d6485..35906a4df5 100644 --- a/src/Umbraco.Web/Install/InstallHelper.cs +++ b/src/Umbraco.Web/Install/InstallHelper.cs @@ -1,13 +1,10 @@ using System; -using System.Collections; using System.Collections.Generic; using System.Configuration; using System.IO; using System.Linq; using System.Net.Http; using System.Web; -using LightInject; -using Semver; using Umbraco.Core; using Umbraco.Core.Configuration; using Umbraco.Core.IO; @@ -15,11 +12,7 @@ using Umbraco.Core.Logging; using Umbraco.Core.Migrations.Install; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.SqlSyntax; -using Umbraco.Core.Scoping; -using Umbraco.Core.Services; -using Umbraco.Web.Cache; using Umbraco.Web.Composing; -using Umbraco.Web.Install.InstallSteps; using Umbraco.Web.Install.Models; namespace Umbraco.Web.Install diff --git a/src/Umbraco.Web/Models/LoginStatusModel.cs b/src/Umbraco.Web/Models/LoginStatusModel.cs index 8578055fae..456564c7f5 100644 --- a/src/Umbraco.Web/Models/LoginStatusModel.cs +++ b/src/Umbraco.Web/Models/LoginStatusModel.cs @@ -1,6 +1,4 @@ -using System; -using System.ComponentModel.DataAnnotations; -using System.Web; +using System.ComponentModel.DataAnnotations; using Umbraco.Core; using Umbraco.Web.Composing; using Umbraco.Web.Security; diff --git a/src/Umbraco.Web/Models/ProfileModel.cs b/src/Umbraco.Web/Models/ProfileModel.cs index c7329aa2f5..d62f85bd04 100644 --- a/src/Umbraco.Web/Models/ProfileModel.cs +++ b/src/Umbraco.Web/Models/ProfileModel.cs @@ -2,10 +2,10 @@ using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.DataAnnotations; -using System.Web; using System.Web.Mvc; using Umbraco.Web.Composing; using Umbraco.Web.Security; +using Umbraco.Core; namespace Umbraco.Web.Models { diff --git a/src/Umbraco.Web/Mvc/EnsurePublishedContentRequestAttribute.cs b/src/Umbraco.Web/Mvc/EnsurePublishedContentRequestAttribute.cs index 92625afdde..b046a0d89a 100644 --- a/src/Umbraco.Web/Mvc/EnsurePublishedContentRequestAttribute.cs +++ b/src/Umbraco.Web/Mvc/EnsurePublishedContentRequestAttribute.cs @@ -3,7 +3,6 @@ using System.Web.Mvc; using Umbraco.Web.Routing; using Umbraco.Core; using Umbraco.Core.Models.PublishedContent; -using LightInject; using Umbraco.Web.Composing; namespace Umbraco.Web.Mvc diff --git a/src/Umbraco.Web/Mvc/RenderRouteHandler.cs b/src/Umbraco.Web/Mvc/RenderRouteHandler.cs index 13aef3a01e..e3c797bead 100644 --- a/src/Umbraco.Web/Mvc/RenderRouteHandler.cs +++ b/src/Umbraco.Web/Mvc/RenderRouteHandler.cs @@ -12,7 +12,6 @@ using Umbraco.Web.Models; using Umbraco.Web.Routing; using System.Collections.Generic; using Current = Umbraco.Web.Composing.Current; -using LightInject; using Umbraco.Web.Features; namespace Umbraco.Web.Mvc diff --git a/src/Umbraco.Web/Mvc/UmbracoController.cs b/src/Umbraco.Web/Mvc/UmbracoController.cs index 50bfe166de..b3c62abec0 100644 --- a/src/Umbraco.Web/Mvc/UmbracoController.cs +++ b/src/Umbraco.Web/Mvc/UmbracoController.cs @@ -6,7 +6,7 @@ using Umbraco.Core.Cache; using Umbraco.Core.Composing; using Umbraco.Core.Configuration; using Umbraco.Core.Logging; -using Umbraco.Core.Persistence; +using Umbraco.Core; using Umbraco.Core.Services; using Umbraco.Web.Security; diff --git a/src/Umbraco.Web/Mvc/UmbracoVirtualNodeRouteHandler.cs b/src/Umbraco.Web/Mvc/UmbracoVirtualNodeRouteHandler.cs index ab474fa699..52fcb0a4cb 100644 --- a/src/Umbraco.Web/Mvc/UmbracoVirtualNodeRouteHandler.cs +++ b/src/Umbraco.Web/Mvc/UmbracoVirtualNodeRouteHandler.cs @@ -4,7 +4,7 @@ using System.Web.Routing; using Umbraco.Core.Models.PublishedContent; using Umbraco.Web.Models; using Umbraco.Web.Routing; -using LightInject; +using Umbraco.Core; namespace Umbraco.Web.Mvc { diff --git a/src/Umbraco.Web/Routing/UrlProviderExtensions.cs b/src/Umbraco.Web/Routing/UrlProviderExtensions.cs index ce09bdc645..3ef69da05d 100644 --- a/src/Umbraco.Web/Routing/UrlProviderExtensions.cs +++ b/src/Umbraco.Web/Routing/UrlProviderExtensions.cs @@ -5,7 +5,6 @@ using Umbraco.Core.Models; using Umbraco.Core.Services; using Umbraco.Core; using Umbraco.Core.Logging; -using LightInject; namespace Umbraco.Web.Routing { diff --git a/src/Umbraco.Web/Runtime/WebRuntimeComponent.cs b/src/Umbraco.Web/Runtime/WebRuntimeComponent.cs index 72b08da4ec..31deac6b68 100644 --- a/src/Umbraco.Web/Runtime/WebRuntimeComponent.cs +++ b/src/Umbraco.Web/Runtime/WebRuntimeComponent.cs @@ -10,6 +10,7 @@ using System.Web.Http; using System.Web.Http.Dispatcher; using System.Web.Mvc; using System.Web.Routing; +using System.Web.Security; using ClientDependency.Core.CompositeFiles.Providers; using ClientDependency.Core.Config; using Examine; @@ -23,28 +24,26 @@ using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.Dictionary; using Umbraco.Core.Events; using Umbraco.Core.Logging; -using Umbraco.Core.Macros; using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.Profiling; using Umbraco.Core.PropertyEditors; using Umbraco.Core.PropertyEditors.ValueConverters; using Umbraco.Core.Runtime; using Umbraco.Core.Services; -using Umbraco.Examine; using Umbraco.Web.Cache; -using Umbraco.Web.Composing.CompositionRoots; +using Umbraco.Web.Composing.Composers; using Umbraco.Web.Dictionary; using Umbraco.Web.Editors; using Umbraco.Web.Features; using Umbraco.Web.HealthCheck; using Umbraco.Web.Install; -using Umbraco.Web.Media; using Umbraco.Web.Models.PublishedContent; using Umbraco.Web.Mvc; using Umbraco.Web.PublishedCache; using Umbraco.Web.Routing; using Umbraco.Web.Search; using Umbraco.Web.Security; +using Umbraco.Web.Security.Providers; using Umbraco.Web.Services; using Umbraco.Web.SignalR; using Umbraco.Web.Tour; @@ -63,14 +62,17 @@ namespace Umbraco.Web.Runtime { base.Compose(composition); - composition.Container.RegisterFrom(); + composition.Container.ComposeWebMappingProfiles(); //register the install components //NOTE: i tried to not have these registered if we weren't installing or upgrading but post install when the site restarts //it still needs to use the install controller so we can't do that - composition.Container.RegisterFrom(); + composition.Container.ComposeInstaller(); - composition.Container.RegisterFrom(); + // register membership stuff + composition.Container.Register(factory => Core.Security.MembershipProviderExtensions.GetMembersMembershipProvider()); + composition.Container.Register(factory => Roles.Enabled ? Roles.Provider : new MembersRoleProvider(factory.GetInstance())); + composition.Container.Register(); // register accessors for cultures composition.Container.RegisterSingleton(); @@ -180,7 +182,7 @@ namespace Umbraco.Web.Runtime .Append(); composition.Container.RegisterSingleton(); - + composition.Container.RegisterSingleton(); // register *all* checks, except those marked [HideFromTypeFinder] of course diff --git a/src/Umbraco.Web/Scheduling/BackgroundTaskRunner.cs b/src/Umbraco.Web/Scheduling/BackgroundTaskRunner.cs index 630d00c95c..76751b6390 100644 --- a/src/Umbraco.Web/Scheduling/BackgroundTaskRunner.cs +++ b/src/Umbraco.Web/Scheduling/BackgroundTaskRunner.cs @@ -6,7 +6,6 @@ using System.Web.Hosting; using Umbraco.Core; using Umbraco.Core.Events; using Umbraco.Core.Logging; -using LightInject; namespace Umbraco.Web.Scheduling { diff --git a/src/Umbraco.Web/Templates/TemplateRenderer.cs b/src/Umbraco.Web/Templates/TemplateRenderer.cs index f2fe2f9a80..18a4db7118 100644 --- a/src/Umbraco.Web/Templates/TemplateRenderer.cs +++ b/src/Umbraco.Web/Templates/TemplateRenderer.cs @@ -12,7 +12,6 @@ using Umbraco.Web.Routing; using umbraco; using Umbraco.Core.Configuration; using Umbraco.Core.Services; -using LightInject; using Umbraco.Web.Composing; namespace Umbraco.Web.Templates diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 203782e125..3ba65cd568 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -109,8 +109,7 @@ - - + @@ -160,7 +159,7 @@ - + diff --git a/src/Umbraco.Web/WebApi/Filters/FeatureAuthorizeAttribute.cs b/src/Umbraco.Web/WebApi/Filters/FeatureAuthorizeAttribute.cs index 0046770599..df5f1a58c4 100644 --- a/src/Umbraco.Web/WebApi/Filters/FeatureAuthorizeAttribute.cs +++ b/src/Umbraco.Web/WebApi/Filters/FeatureAuthorizeAttribute.cs @@ -1,8 +1,8 @@ using System.Web.Http; using System.Web.Http.Controllers; -using LightInject; using Umbraco.Core.Composing; using Umbraco.Web.Features; +using Umbraco.Core; namespace Umbraco.Web.WebApi.Filters { @@ -12,18 +12,27 @@ namespace Umbraco.Web.WebApi.Filters /// Else returns unauthorized. public sealed class FeatureAuthorizeAttribute : AuthorizeAttribute { + private readonly UmbracoFeatures _features; + + /// + /// Initializes a new instance of the class. + /// + public FeatureAuthorizeAttribute() + { + // attributes have to use Current.Container + _features = Current.Container?.TryGetInstance(); + } + protected override bool IsAuthorized(HttpActionContext actionContext) { // if no features resolver has been set then return true, this will occur in unit // tests and we don't want users to have to set a resolver //just so their unit tests work. - // fixme inject? - var features = Current.Container?.TryGetInstance(); - if (features == null) return true; + if (_features == null) return true; var controllerType = actionContext.ControllerContext.ControllerDescriptor.ControllerType; - return features.IsControllerEnabled(controllerType); + return _features.IsControllerEnabled(controllerType); } } }