diff --git a/src/Umbraco.Core/Actions/ActionCollectionBuilder.cs b/src/Umbraco.Core/Actions/ActionCollectionBuilder.cs index eaea63b3a3..1fe3008610 100644 --- a/src/Umbraco.Core/Actions/ActionCollectionBuilder.cs +++ b/src/Umbraco.Core/Actions/ActionCollectionBuilder.cs @@ -8,7 +8,7 @@ namespace Umbraco.Web.Actions { protected override ActionCollectionBuilder This => this; - protected override IEnumerable CreateItems(IFactory factory) + protected override IEnumerable CreateItems(IServiceProvider factory) { var items = base.CreateItems(factory).ToList(); diff --git a/src/Umbraco.Core/Composing/CollectionBuilderBase.cs b/src/Umbraco.Core/Composing/CollectionBuilderBase.cs index 2b47ba2a86..1c4de6cd8e 100644 --- a/src/Umbraco.Core/Composing/CollectionBuilderBase.cs +++ b/src/Umbraco.Core/Composing/CollectionBuilderBase.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using Microsoft.Extensions.DependencyInjection; namespace Umbraco.Core.Composing { @@ -24,22 +25,22 @@ namespace Umbraco.Core.Composing public IEnumerable GetTypes() => _types; /// - public virtual void RegisterWith(IRegister register) + public virtual void RegisterWith(IServiceCollection services) { if (_registeredTypes != null) throw new InvalidOperationException("This builder has already been registered."); // register the collection - register.Register(CreateCollection, CollectionLifetime); + services.Add(new ServiceDescriptor(typeof(TCollection), CreateCollection, CollectionLifetime)); // register the types - RegisterTypes(register); + RegisterTypes(services); } /// /// Gets the collection lifetime. /// - protected virtual Lifetime CollectionLifetime => Lifetime.Singleton; + protected virtual ServiceLifetime CollectionLifetime => ServiceLifetime.Singleton; /// /// Configures the internal list of types. @@ -67,7 +68,7 @@ namespace Umbraco.Core.Composing return types; } - private void RegisterTypes(IRegister register) + private void RegisterTypes(IServiceCollection services) { lock (_locker) { @@ -84,7 +85,7 @@ namespace Umbraco.Core.Composing // was a dependency on an individual item, it would resolve a brand new transient instance which isn't what // we would expect to happen. The same item should be resolved from the container as the collection. foreach (var type in types) - register.Register(type, CollectionLifetime); + services.Add(new ServiceDescriptor(type, type, CollectionLifetime)); _registeredTypes = types; } @@ -94,7 +95,7 @@ namespace Umbraco.Core.Composing /// Creates the collection items. /// /// The collection items. - protected virtual IEnumerable CreateItems(IFactory factory) + protected virtual IEnumerable CreateItems(IServiceProvider factory) { if (_registeredTypes == null) throw new InvalidOperationException("Cannot create items before the collection builder has been registered."); @@ -107,7 +108,7 @@ namespace Umbraco.Core.Composing /// /// Creates a collection item. /// - protected virtual TItem CreateItem(IFactory factory, Type itemType) + protected virtual TItem CreateItem(IServiceProvider factory, Type itemType) => (TItem) factory.GetRequiredService(itemType); /// @@ -115,7 +116,7 @@ namespace Umbraco.Core.Composing /// /// A collection. /// Creates a new collection each time it is invoked. - public virtual TCollection CreateCollection(IFactory factory) + public virtual TCollection CreateCollection(IServiceProvider factory) { return factory.CreateInstance( CreateItems(factory)); } diff --git a/src/Umbraco.Core/Composing/ComponentCollectionBuilder.cs b/src/Umbraco.Core/Composing/ComponentCollectionBuilder.cs index 05e627b41e..903e2199e7 100644 --- a/src/Umbraco.Core/Composing/ComponentCollectionBuilder.cs +++ b/src/Umbraco.Core/Composing/ComponentCollectionBuilder.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using Microsoft.Extensions.DependencyInjection; using Umbraco.Core.Logging; namespace Umbraco.Core.Composing @@ -18,7 +19,7 @@ namespace Umbraco.Core.Composing protected override ComponentCollectionBuilder This => this; - protected override IEnumerable CreateItems(IFactory factory) + protected override IEnumerable CreateItems(IServiceProvider factory) { _logger = factory.GetRequiredService(); @@ -28,7 +29,7 @@ namespace Umbraco.Core.Composing } } - protected override IComponent CreateItem(IFactory factory, Type itemType) + protected override IComponent CreateItem(IServiceProvider factory, Type itemType) { using (_logger.DebugDuration($"Creating {itemType.FullName}.", $"Created {itemType.FullName}.", thresholdMilliseconds: LogThresholdMilliseconds)) { diff --git a/src/Umbraco.Core/Composing/Composition.cs b/src/Umbraco.Core/Composing/Composition.cs index 66e6e03e8e..fcadf7dd1b 100644 --- a/src/Umbraco.Core/Composing/Composition.cs +++ b/src/Umbraco.Core/Composing/Composition.cs @@ -1,14 +1,9 @@ using System; using System.Collections.Generic; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.DependencyInjection.Extensions; using Umbraco.Core.Cache; -using Umbraco.Core.Configuration; using Umbraco.Core.IO; using Umbraco.Core.Logging; -using Umbraco.Infrastructure.Composing; - -using NoFactory = Umbraco.Infrastructure.Composing.ServiceProviderFactoryAdapter; namespace Umbraco.Core.Composing { @@ -22,8 +17,14 @@ namespace Umbraco.Core.Composing /// may cause issues. public class Composition { + public TypeLoader TypeLoader { get; } + public IRuntimeState RuntimeState { get; } + public IProfilingLogger Logger { get; } + public IIOHelper IOHelper { get; } + public AppCaches AppCaches { get; } + public IServiceCollection Services { get; } + private readonly Dictionary _builders = new Dictionary(); - private IRegister _register => ServiceCollectionRegistryAdapter.Wrap(Services); public Composition(IServiceCollection services, TypeLoader typeLoader, IProfilingLogger logger, IRuntimeState runtimeState, IIOHelper ioHelper, AppCaches appCaches) { @@ -35,88 +36,13 @@ namespace Umbraco.Core.Composing AppCaches = appCaches ?? throw new ArgumentNullException(nameof(appCaches)); } - #region Services - - /// - /// Gets the logger. - /// - public IProfilingLogger Logger { get; } - - public IIOHelper IOHelper { get; } - public AppCaches AppCaches { get; } - - public IServiceCollection Services { get; } - - /// - /// Gets the type loader. - /// - public TypeLoader TypeLoader { get; } - - /// - /// Gets the runtime state. - /// - public IRuntimeState RuntimeState { get; } - - #endregion - - #region IRegister - - /// - public void Register(Type serviceType, Lifetime lifetime = Lifetime.Transient) - => _register.Register(serviceType, lifetime); - - /// - public void Register(Type serviceType, Type implementingType, Lifetime lifetime = Lifetime.Transient) - => _register.Register(serviceType, implementingType, lifetime); - - /// - public void Register(Func factory, Lifetime lifetime = Lifetime.Transient) - where TService : class - => _register.Register(factory, lifetime); - - /// - public void Register(Type serviceType, object instance) - => _register.Register(serviceType, instance); - - - /// public void RegisterBuilders() { foreach (var builder in _builders.Values) - builder.RegisterWith(_register); + builder.RegisterWith(Services); _builders.Clear(); // no point keep them around } - #endregion - - #region Unique - - /// - /// Registers a unique service with an implementation type. - /// - /// Unique services have one single implementation, and a Singleton lifetime. - public void RegisterUnique(Type serviceType, Type implementingType) - => Services.Replace(ServiceDescriptor.Singleton(serviceType, implementingType)); - - /// - /// Registers a unique service with an implementation factory. - /// - /// Unique services have one single implementation, and a Singleton lifetime. - public void RegisterUnique(Func factory) - where TService : class - => Services.Replace(ServiceDescriptor.Singleton(sp => factory(NoFactory.Wrap(sp)))); - - /// - /// Registers a unique service with an implementing instance. - /// - /// Unique services have one single implementation, and a Singleton lifetime. - public void RegisterUnique(Type serviceType, object instance) - => Services.Replace(ServiceDescriptor.Singleton(serviceType, instance)); - - #endregion - - #region Collection Builders - /// /// Gets a collection builder (and registers the collection). /// @@ -134,7 +60,5 @@ namespace Umbraco.Core.Composing _builders[typeOfBuilder] = builder; return builder; } - - #endregion } } diff --git a/src/Umbraco.Core/Composing/CompositionExtensions.cs b/src/Umbraco.Core/Composing/CompositionExtensions.cs index 262c2a903c..b3dc4301c3 100644 --- a/src/Umbraco.Core/Composing/CompositionExtensions.cs +++ b/src/Umbraco.Core/Composing/CompositionExtensions.cs @@ -12,9 +12,9 @@ namespace Umbraco.Infrastructure.PublishedCache /// /// The composition. /// A function creating a published snapshot service. - public static void SetPublishedSnapshotService(this Composition composition, Func factory) + public static void SetPublishedSnapshotService(this Composition composition, Func factory) { - composition.RegisterUnique(factory); + composition.Services.AddUnique(factory); } /// @@ -23,9 +23,9 @@ namespace Umbraco.Infrastructure.PublishedCache /// The type of the published snapshot service. /// The composition. public static void SetPublishedSnapshotService(this Composition composition) - where T : IPublishedSnapshotService + where T : class, IPublishedSnapshotService { - composition.RegisterUnique(); + composition.Services.AddUnique(); } /// @@ -35,7 +35,7 @@ namespace Umbraco.Infrastructure.PublishedCache /// A published snapshot service. public static void SetPublishedSnapshotService(this Composition composition, IPublishedSnapshotService service) { - composition.RegisterUnique(_ => service); + composition.Services.AddUnique(_ => service); } } } diff --git a/src/Umbraco.Core/Composing/ICollectionBuilder.cs b/src/Umbraco.Core/Composing/ICollectionBuilder.cs index 84ff3ba747..a48d06d2dd 100644 --- a/src/Umbraco.Core/Composing/ICollectionBuilder.cs +++ b/src/Umbraco.Core/Composing/ICollectionBuilder.cs @@ -1,4 +1,7 @@ -namespace Umbraco.Core.Composing +using System; +using Microsoft.Extensions.DependencyInjection; + +namespace Umbraco.Core.Composing { /// /// Represents a collection builder. @@ -9,7 +12,7 @@ /// Registers the builder so it can build the collection, by /// registering the collection and the types. /// - void RegisterWith(IRegister register); + void RegisterWith(IServiceCollection services); } /// @@ -25,6 +28,6 @@ /// /// A collection. /// Creates a new collection each time it is invoked. - TCollection CreateCollection(IFactory factory); + TCollection CreateCollection(IServiceProvider factory); } } diff --git a/src/Umbraco.Core/Composing/IFactory.cs b/src/Umbraco.Core/Composing/IFactory.cs deleted file mode 100644 index 7a2af7756e..0000000000 --- a/src/Umbraco.Core/Composing/IFactory.cs +++ /dev/null @@ -1,56 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace Umbraco.Core.Composing -{ - /// - /// Defines a service factory for Umbraco. - /// - public interface IFactory - { - /// - /// Gets the concrete factory. - /// - object Concrete { get; } - - /// - /// Gets an instance of a service. - /// - /// The type of the service. - /// An instance of the specified type. - /// Throws an exception if the container failed to get an instance of the specified type. - object GetRequiredService(Type type); - - /// - /// Tries to get an instance of a service. - /// - /// The type of the service. - /// 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. - object GetService(Type type); - - /// - /// Gets all instances of a service. - /// - /// The type of the service. - IEnumerable GetServices(Type serviceType); - - /// - /// Gets all instances of a service. - /// - /// The type of the service. - IEnumerable GetServices() - where TService : class; - - /// - /// Begins a scope. - /// - /// - /// When the scope is disposed, scoped instances that have been created during the scope are disposed. - /// Scopes can be nested. Each instance is disposed individually. - /// - IDisposable BeginScope(); - } -} diff --git a/src/Umbraco.Core/Composing/IRegister.cs b/src/Umbraco.Core/Composing/IRegister.cs deleted file mode 100644 index f00d8ac071..0000000000 --- a/src/Umbraco.Core/Composing/IRegister.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; - -namespace Umbraco.Core.Composing -{ - /// - /// Defines a service register for Umbraco. - /// - public interface IRegister - { - /// - /// Registers a service as its own implementation. - /// - void Register(Type serviceType, Lifetime lifetime = Lifetime.Transient); - - /// - /// Registers a service with an implementation type. - /// - void Register(Type serviceType, Type implementingType, Lifetime lifetime = Lifetime.Transient); - - /// - /// Registers a service with an implementation factory. - /// - void Register(Func factory, Lifetime lifetime = Lifetime.Transient) - where TService : class; - - /// - /// Registers a service with an implementing instance. - /// - void Register(Type serviceType, object instance); - - #region Control - - /// - /// Creates the factory. - /// - IFactory CreateFactory(); - - #endregion - } -} diff --git a/src/Umbraco.Core/Composing/LazyResolve.cs b/src/Umbraco.Core/Composing/LazyResolve.cs new file mode 100644 index 0000000000..5a60b54d87 --- /dev/null +++ b/src/Umbraco.Core/Composing/LazyResolve.cs @@ -0,0 +1,13 @@ +using System; +using Microsoft.Extensions.DependencyInjection; + +namespace Umbraco.Core.Composing +{ + public class LazyResolve : Lazy + where T : class + { + public LazyResolve(IServiceProvider serviceProvider) + : base(serviceProvider.GetRequiredService) + { } + } +} diff --git a/src/Umbraco.Core/Composing/Lifetime.cs b/src/Umbraco.Core/Composing/Lifetime.cs deleted file mode 100644 index 012555be5e..0000000000 --- a/src/Umbraco.Core/Composing/Lifetime.cs +++ /dev/null @@ -1,80 +0,0 @@ -namespace Umbraco.Core.Composing -{ - /// - /// Specifies the lifetime of a registered instance. - /// - public enum Lifetime - { - /// - /// Always get a new instance. - /// - /// Corresponds to Transient in LightInject, Castle Windsor - /// or MS.DI, PerDependency in Autofac. - Transient, - - // TODO: We need to fix this up, currently LightInject is the only one that behaves differently from all other containers. - // ... the simple fix would be to map this to PerScopeLifetime in LI but need to wait on a response here https://github.com/seesharper/LightInject/issues/494#issuecomment-518942625 - // - // we use it for controllers, httpContextBase and other request scoped objects: MembershpHelper, TagQuery, UmbracoTreeSearcher and ISearchableTree - // - so that they are automatically disposed at the end of the scope (ie request) - // - not sure they should not be simply 'scoped'? - - /// - /// One unique instance per request. - /// - /// - /// - /// Any instance created with this lifetime will be disposed at the end of a request. - /// - /// Corresponds to - /// - /// PerRequestLifeTime in LightInject - means transient but disposed at the end of the current web request. - /// see: https://github.com/seesharper/LightInject/issues/494#issuecomment-518493262 - /// - /// - /// Scoped in MS.DI - means one per web request. - /// see https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-2.2#service-lifetimes - /// - /// InstancePerRequest in Autofac - means one per web request. - /// see https://autofaccn.readthedocs.io/en/latest/lifetime/instance-scope.html#instance-per-request - /// But "Behind the scenes, though, it’s still just instance per matching lifetime scope." - /// - /// - /// LifestylePerWebRequest in Castle Windsor - means one per web request. - /// see https://github.com/castleproject/Windsor/blob/master/docs/mvc-tutorial-part-7-lifestyles.md#the-perwebrequest-lifestyle - /// - /// - Request, - - /// - /// One unique instance per scope. - /// - /// - /// - /// Any instance created with this lifetime will be disposed at the end of the current scope. - /// - /// Corresponds to - /// PerScopeLifetime in LightInject (when in a request, means one per web request) - /// - /// Scoped in MS.DI (when in a request, means one per web request) - /// see https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-2.2#service-lifetimes - /// - /// InstancePerLifetimeScope in Autofac (when in a request, means one per web request) - /// see https://autofaccn.readthedocs.io/en/latest/lifetime/instance-scope.html#instance-per-lifetime-scope - /// Also note that Autofac's InstancePerRequest is the same as this, see https://autofaccn.readthedocs.io/en/latest/lifetime/instance-scope.html#instance-per-request - /// it says "Behind the scenes, though, it’s still just instance per matching lifetime scope." - /// - /// - /// LifestyleScoped in Castle Windsor - /// - /// - Scope, - - /// - /// One unique instance per container. - /// - /// Corresponds to Singleton in LightInject, Castle Windsor - /// or MS.DI and to SingleInstance in Autofac. - Singleton - } -} diff --git a/src/Umbraco.Core/Composing/ServiceCollectionRegistryAdapter.cs b/src/Umbraco.Core/Composing/ServiceCollectionRegistryAdapter.cs deleted file mode 100644 index 7058ba1e5d..0000000000 --- a/src/Umbraco.Core/Composing/ServiceCollectionRegistryAdapter.cs +++ /dev/null @@ -1,97 +0,0 @@ -using System; -using Microsoft.Extensions.DependencyInjection; -using Umbraco.Core.Composing; - -namespace Umbraco.Infrastructure.Composing -{ - public class ServiceCollectionRegistryAdapter : IRegister - { - public IServiceCollection Services { get; } - - public ServiceCollectionRegistryAdapter(IServiceCollection services) - { - Services = services ?? throw new ArgumentNullException(nameof(services)); - Services.AddTransient(typeof(Lazy<>), typeof(LazyResolve<>)); - } - - public void Register(Type serviceType, Lifetime lifetime = Lifetime.Transient) - { - switch (lifetime) - { - case Lifetime.Request: - case Lifetime.Scope: - Services.AddScoped(serviceType); - break; - case Lifetime.Transient: - Services.AddTransient(serviceType); - break; - case Lifetime.Singleton: - Services.AddSingleton(serviceType); - break; - default: - throw new NotImplementedException($"Unhandled Lifetime: {lifetime}"); - } - } - - public void Register(Type serviceType, Type implementingType, Lifetime lifetime = Lifetime.Transient) - { - switch (lifetime) - { - case Lifetime.Request: - case Lifetime.Scope: - Services.AddScoped(serviceType, implementingType); - break; - case Lifetime.Transient: - Services.AddTransient(serviceType, implementingType); - break; - case Lifetime.Singleton: - Services.AddSingleton(serviceType, implementingType); - break; - default: - throw new NotImplementedException($"Unhandled Lifetime: {lifetime}"); - } - } - - public void Register(Func factory, Lifetime lifetime = Lifetime.Transient) where TService : class - { - switch (lifetime) - { - case Lifetime.Request: - case Lifetime.Scope: - Services.AddScoped(sp => factory(ServiceProviderFactoryAdapter.Wrap(sp))); - break; - case Lifetime.Transient: - Services.AddTransient(sp => factory(ServiceProviderFactoryAdapter.Wrap(sp))); - break; - case Lifetime.Singleton: - Services.AddSingleton(sp => factory(ServiceProviderFactoryAdapter.Wrap(sp))); - break; - default: - throw new NotImplementedException($"Unhandled Lifetime: {lifetime}"); - } - } - public void Register(Type serviceType, object instance) - { - Services.AddSingleton(serviceType, instance); - } - - public IFactory CreateFactory() - { - return ServiceProviderFactoryAdapter.Wrap(Services.BuildServiceProvider()); - } - - public static IRegister Wrap(IServiceCollection services) - { - return new ServiceCollectionRegistryAdapter(services); - } - } - - public class LazyResolve : Lazy - where T : class - { - public LazyResolve(IServiceProvider serviceProvider) : base(serviceProvider.GetRequiredService) - { - - } - } -} diff --git a/src/Umbraco.Core/Composing/ServiceProviderFactoryAdapter.cs b/src/Umbraco.Core/Composing/ServiceProviderFactoryAdapter.cs deleted file mode 100644 index eb53880ee2..0000000000 --- a/src/Umbraco.Core/Composing/ServiceProviderFactoryAdapter.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System; -using System.Collections.Generic; -using Microsoft.Extensions.DependencyInjection; -using Umbraco.Core.Composing; - -namespace Umbraco.Infrastructure.Composing -{ - public class ServiceProviderFactoryAdapter : IFactory - { - public IServiceProvider ServiceProvider { get; } - - private ServiceProviderFactoryAdapter(IServiceProvider serviceProvider) - { - ServiceProvider = serviceProvider; - } - - public object Concrete => ServiceProvider; - - public object GetRequiredService(Type type) - { - return ServiceProvider.GetRequiredService(type); - } - - public object GetService(Type type) - { - return ServiceProvider.GetService(type); - } - - public IEnumerable GetServices(Type serviceType) - { - return ServiceProvider.GetServices(serviceType); - } - - public IEnumerable GetServices() where TService : class - { - return ServiceProvider.GetServices(); - } - - public IDisposable BeginScope() - { - return ServiceProvider.CreateScope(); - } - - public static IFactory Wrap(IServiceProvider serviceProvider) - { - return new ServiceProviderFactoryAdapter(serviceProvider); - } - } -} diff --git a/src/Umbraco.Core/Composing/TypeCollectionBuilderBase.cs b/src/Umbraco.Core/Composing/TypeCollectionBuilderBase.cs index b4dcd39da2..edbf554a2c 100644 --- a/src/Umbraco.Core/Composing/TypeCollectionBuilderBase.cs +++ b/src/Umbraco.Core/Composing/TypeCollectionBuilderBase.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using Microsoft.Extensions.DependencyInjection; namespace Umbraco.Core.Composing { @@ -51,14 +52,14 @@ namespace Umbraco.Core.Composing return This; } - public TCollection CreateCollection(IFactory factory) + public TCollection CreateCollection(IServiceProvider factory) { return factory.CreateInstance(_types); } - public void RegisterWith(IRegister register) + public void RegisterWith(IServiceCollection services) { - register.Register(CreateCollection, Lifetime.Singleton); + services.Add(new ServiceDescriptor(typeof(TCollection), CreateCollection, ServiceLifetime.Singleton)); } } } diff --git a/src/Umbraco.Core/CompositionExtensions_Uniques.cs b/src/Umbraco.Core/CompositionExtensions_Uniques.cs deleted file mode 100644 index 11d4877aca..0000000000 --- a/src/Umbraco.Core/CompositionExtensions_Uniques.cs +++ /dev/null @@ -1,43 +0,0 @@ -using Umbraco.Core.Composing; - -namespace Umbraco.Core -{ - /// - /// Provides extension methods to the class. - /// - public static partial class CompositionExtensions - { - /// - /// Registers a unique service as its own implementation. - /// - public static void RegisterUnique(this Composition composition) - => composition.RegisterUnique(typeof(TService), typeof(TService)); - - /// - /// Registers a unique service with an implementation type. - /// - public static void RegisterUnique(this Composition composition) - => composition.RegisterUnique(typeof(TService), typeof(TImplementing)); - - /// - /// Registers a unique service with an implementing instance. - /// - public static void RegisterUnique(this Composition composition, TService instance) - => composition.RegisterUnique(typeof(TService), instance); - - - - /// - /// Registers a unique service with an implementation type. - /// - public static void RegisterMultipleUnique(this Composition composition) - where TImplementing : class, TService1, TService2 - where TService1 : class - where TService2 : class - { - composition.RegisterUnique(); - composition.RegisterUnique(factory => factory.GetRequiredService()); - composition.RegisterUnique(factory => factory.GetRequiredService()); - } - } -} diff --git a/src/Umbraco.Core/ContentApps/ContentAppFactoryCollectionBuilder.cs b/src/Umbraco.Core/ContentApps/ContentAppFactoryCollectionBuilder.cs index 4e1c7d8693..0f0e09042b 100644 --- a/src/Umbraco.Core/ContentApps/ContentAppFactoryCollectionBuilder.cs +++ b/src/Umbraco.Core/ContentApps/ContentAppFactoryCollectionBuilder.cs @@ -1,5 +1,7 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Umbraco.Core; using Umbraco.Core.Composing; @@ -15,7 +17,7 @@ namespace Umbraco.Web.ContentApps protected override ContentAppFactoryCollectionBuilder This => this; // need to inject dependencies in the collection, so override creation - public override ContentAppFactoryCollection CreateCollection(IFactory factory) + public override ContentAppFactoryCollection CreateCollection(IServiceProvider factory) { // get the logger factory just-in-time - see note below for manifest parser var loggerFactory = factory.GetRequiredService(); @@ -23,7 +25,7 @@ namespace Umbraco.Web.ContentApps return new ContentAppFactoryCollection(CreateItems(factory), loggerFactory.CreateLogger(), umbracoContextAccessor); } - protected override IEnumerable CreateItems(IFactory factory) + protected override IEnumerable CreateItems(IServiceProvider factory) { // get the manifest parser just-in-time - injecting it in the ctor would mean that // simply getting the builder in order to configure the collection, would require diff --git a/src/Umbraco.Core/Dashboards/DashboardCollectionBuilder.cs b/src/Umbraco.Core/Dashboards/DashboardCollectionBuilder.cs index 8bad0cb23c..7ed241b819 100644 --- a/src/Umbraco.Core/Dashboards/DashboardCollectionBuilder.cs +++ b/src/Umbraco.Core/Dashboards/DashboardCollectionBuilder.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using Microsoft.Extensions.DependencyInjection; using Umbraco.Core; using Umbraco.Core.Composing; using Umbraco.Core.Dashboards; @@ -26,7 +27,7 @@ namespace Umbraco.Web.Dashboards return this; } - protected override IEnumerable CreateItems(IFactory factory) + protected override IEnumerable CreateItems(IServiceProvider factory) { // get the manifest parser just-in-time - injecting it in the ctor would mean that // simply getting the builder in order to configure the collection, would require diff --git a/src/Umbraco.Core/FactoryExtensions.cs b/src/Umbraco.Core/FactoryExtensions.cs deleted file mode 100644 index 0a5c04c98f..0000000000 --- a/src/Umbraco.Core/FactoryExtensions.cs +++ /dev/null @@ -1,105 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using Umbraco.Core.Composing; - -namespace Umbraco.Core -{ - /// - /// Provides extension methods to the class. - /// - public static class FactoryExtensions - { - /// - /// Gets an instance of a service. - /// - /// The type of the service. - /// The factory. - /// An instance of the specified type. - /// Throws an exception if the factory failed to get an instance of the specified type. - public static T GetRequiredService(this IFactory factory) - where T : class - => (T)factory.GetRequiredService(typeof(T)); - - /// - /// Tries to get an instance of a service. - /// - /// The type of the service. - /// An instance of the specified type, or null. - /// Returns null if the factory does not know how to get an instance - /// of the specified type. Throws an exception if the factory does know how - /// to get an instance of the specified type, but failed to do so. - public static T GetService(this IFactory factory) - where T : class - => (T)factory.GetService(typeof(T)); - - /// - /// Creates an instance with arguments. - /// - /// The type of the instance. - /// The factory. - /// Arguments. - /// An instance of the specified type. - /// - /// Throws an exception if the factory failed to get an instance of the specified type. - /// The arguments are used as dependencies by the factory. - /// - public static T CreateInstance(this IFactory factory, params object[] args) - where T : class - => (T)factory.CreateInstance(typeof(T), args); - - /// - /// Creates an instance of a service, with arguments. - /// - /// - /// The type of the instance. - /// Named arguments. - /// An instance of the specified type. - /// - /// The instance type does not need to be registered into the factory. - /// The arguments are used as dependencies by the factory. Other dependencies - /// are retrieved from the factory. - /// - public static object CreateInstance(this IFactory factory, Type type, params object[] args) - { - // LightInject has this, but then it requires RegisterConstructorDependency etc and has various oddities - // including the most annoying one, which is that it does not work on singletons (hard to fix) - //return factory.GetInstance(type, args); - - // this method is essentially used to build singleton instances, so it is assumed that it would be - // more expensive to build and cache a dynamic method ctor than to simply invoke the ctor, as we do - // here - this can be discussed - - // TODO: we currently try the ctor with most parameters, but we could want to fall back to others - - var ctor = type.GetConstructors(BindingFlags.Instance | BindingFlags.Public).OrderByDescending(x => x.GetParameters().Length).FirstOrDefault(); - if (ctor == null) throw new InvalidOperationException($"Could not find a public constructor for type {type.FullName}."); - - var ctorParameters = ctor.GetParameters(); - var ctorArgs = new object[ctorParameters.Length]; - var availableArgs = new List(args); - var i = 0; - foreach (var parameter in ctorParameters) - { - // no! IsInstanceOfType is not ok here - // ReSharper disable once UseMethodIsInstanceOfType - var idx = availableArgs.FindIndex(a => parameter.ParameterType.IsAssignableFrom(a.GetType())); - if(idx >= 0) - { - // Found a suitable supplied argument - ctorArgs[i++] = availableArgs[idx]; - - // A supplied argument can be used at most once - availableArgs.RemoveAt(idx); - } - else - { - // None of the provided arguments is suitable: get an instance from the factory - ctorArgs[i++] = factory.GetRequiredService(parameter.ParameterType); - } - } - return ctor.Invoke(ctorArgs); - } - } -} diff --git a/src/Umbraco.Core/HealthCheck/HeathCheckCollectionBuilder.cs b/src/Umbraco.Core/HealthCheck/HeathCheckCollectionBuilder.cs index 0894cb1912..be3a788cff 100644 --- a/src/Umbraco.Core/HealthCheck/HeathCheckCollectionBuilder.cs +++ b/src/Umbraco.Core/HealthCheck/HeathCheckCollectionBuilder.cs @@ -1,4 +1,5 @@ -using Umbraco.Core.Composing; +using Microsoft.Extensions.DependencyInjection; +using Umbraco.Core.Composing; namespace Umbraco.Core.HealthCheck { @@ -8,6 +9,6 @@ namespace Umbraco.Core.HealthCheck // note: in v7 they were per-request, not sure why? // the collection is injected into the controller & there's only 1 controller per request anyways - protected override Lifetime CollectionLifetime => Lifetime.Transient; // transient! + protected override ServiceLifetime CollectionLifetime => ServiceLifetime.Transient; // transient! } } diff --git a/src/Umbraco.Core/IO/FileSystems.cs b/src/Umbraco.Core/IO/FileSystems.cs index 485e6b6446..a19ebd999b 100644 --- a/src/Umbraco.Core/IO/FileSystems.cs +++ b/src/Umbraco.Core/IO/FileSystems.cs @@ -3,8 +3,6 @@ using System.Collections.Concurrent; using System.Collections.Generic; using System.Threading; using Microsoft.Extensions.Logging; -using Umbraco.Core.Composing; -using Umbraco.Core.Configuration; using Umbraco.Core.Hosting; using Umbraco.Core.Configuration.Models; using Microsoft.Extensions.Options; @@ -13,7 +11,7 @@ namespace Umbraco.Core.IO { public class FileSystems : IFileSystems { - private readonly IFactory _container; + private readonly IServiceProvider _container; private readonly ILogger _logger; private readonly ILoggerFactory _loggerFactory; private readonly IIOHelper _ioHelper; @@ -39,7 +37,7 @@ namespace Umbraco.Core.IO #region Constructor // DI wants a public ctor - public FileSystems(IFactory container, ILogger logger, ILoggerFactory loggerFactory, IIOHelper ioHelper, IOptions globalSettings, IHostingEnvironment hostingEnvironment) + public FileSystems(IServiceProvider container, ILogger logger, ILoggerFactory loggerFactory, IIOHelper ioHelper, IOptions globalSettings, IHostingEnvironment hostingEnvironment) { _container = container; _logger = logger; diff --git a/src/Umbraco.Core/Manifest/ManifestFilterCollectionBuilder.cs b/src/Umbraco.Core/Manifest/ManifestFilterCollectionBuilder.cs index 4d98700f93..47593c2548 100644 --- a/src/Umbraco.Core/Manifest/ManifestFilterCollectionBuilder.cs +++ b/src/Umbraco.Core/Manifest/ManifestFilterCollectionBuilder.cs @@ -1,4 +1,5 @@ -using Umbraco.Core.Composing; +using Microsoft.Extensions.DependencyInjection; +using Umbraco.Core.Composing; namespace Umbraco.Core.Manifest { @@ -7,6 +8,6 @@ namespace Umbraco.Core.Manifest protected override ManifestFilterCollectionBuilder This => this; // do NOT cache this, it's only used once - protected override Lifetime CollectionLifetime => Lifetime.Transient; + protected override ServiceLifetime CollectionLifetime => ServiceLifetime.Transient; } -} \ No newline at end of file +} diff --git a/src/Umbraco.Core/Mapping/MapDefinitionCollectionBuilder.cs b/src/Umbraco.Core/Mapping/MapDefinitionCollectionBuilder.cs index 15d94e58a0..6cccde9525 100644 --- a/src/Umbraco.Core/Mapping/MapDefinitionCollectionBuilder.cs +++ b/src/Umbraco.Core/Mapping/MapDefinitionCollectionBuilder.cs @@ -1,4 +1,5 @@ -using Umbraco.Core.Composing; +using Microsoft.Extensions.DependencyInjection; +using Umbraco.Core.Composing; namespace Umbraco.Core.Mapping { @@ -6,6 +7,6 @@ namespace Umbraco.Core.Mapping { protected override MapDefinitionCollectionBuilder This => this; - protected override Lifetime CollectionLifetime => Lifetime.Transient; + protected override ServiceLifetime CollectionLifetime => ServiceLifetime.Transient; } } diff --git a/src/Umbraco.Core/RegisterExtensions.cs b/src/Umbraco.Core/RegisterExtensions.cs deleted file mode 100644 index 67f256a26f..0000000000 --- a/src/Umbraco.Core/RegisterExtensions.cs +++ /dev/null @@ -1,30 +0,0 @@ -using Umbraco.Core.Composing; - -namespace Umbraco.Core -{ - /// - /// Provides extension methods to the class. - /// - public static class RegisterExtensions - { - /// - /// Registers a service with an implementation type. - /// - public static void Register(this IRegister register, Lifetime lifetime = Lifetime.Transient) - => register.Register(typeof(TService), typeof(TImplementing), lifetime); - - /// - /// Registers a service as its own implementation. - /// - public static void Register(this IRegister register, Lifetime lifetime = Lifetime.Transient) - where TService : class - => register.Register(typeof(TService), lifetime); - - /// - /// Registers a service with an implementing instance. - /// - public static void Register(this IRegister register, TService instance) - where TService : class - => register.Register(typeof(TService), instance); - } -} diff --git a/src/Umbraco.Core/Sections/SectionCollectionBuilder.cs b/src/Umbraco.Core/Sections/SectionCollectionBuilder.cs index d122816949..9bda065881 100644 --- a/src/Umbraco.Core/Sections/SectionCollectionBuilder.cs +++ b/src/Umbraco.Core/Sections/SectionCollectionBuilder.cs @@ -1,6 +1,7 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; -using Umbraco.Core; +using Microsoft.Extensions.DependencyInjection; using Umbraco.Core.Composing; using Umbraco.Core.Manifest; using Umbraco.Core.Models.Sections; @@ -11,7 +12,7 @@ namespace Umbraco.Web.Sections { protected override SectionCollectionBuilder This => this; - protected override IEnumerable CreateItems(IFactory factory) + protected override IEnumerable CreateItems(IServiceProvider factory) { // get the manifest parser just-in-time - injecting it in the ctor would mean that // simply getting the builder in order to configure the collection, would require diff --git a/src/Umbraco.Core/ServiceCollectionExtensions.cs b/src/Umbraco.Core/ServiceCollectionExtensions.cs new file mode 100644 index 0000000000..3202cc3a38 --- /dev/null +++ b/src/Umbraco.Core/ServiceCollectionExtensions.cs @@ -0,0 +1,47 @@ +using System; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; +using Umbraco.Core.Composing; + +namespace Umbraco.Core +{ + public static class ServiceCollectionExtensions + { + public static void AddUnique(this IServiceCollection services) + where TService : class + where TImplementing : class, TService + => services.Replace(ServiceDescriptor.Singleton()); + + public static void AddUnique(this IServiceCollection services) + where TImplementing : class + => services.Replace(ServiceDescriptor.Singleton()); + + /// + /// Registers a unique service with an implementation factory. + /// + /// Unique services have one single implementation, and a Singleton lifetime. + public static void AddUnique(this IServiceCollection services, Func factory) + where TService : class + => services.Replace(ServiceDescriptor.Singleton(factory)); + + /// + /// Registers a unique service with an implementing instance. + /// + /// Unique services have one single implementation, and a Singleton lifetime. + public static void AddUnique(this IServiceCollection services, Type serviceType, object instance) + => services.Replace(ServiceDescriptor.Singleton(serviceType, instance)); + + /// + /// Registers a unique service with an implementing instance. + /// + public static void AddUnique(this IServiceCollection services, TService instance) + where TService : class + => services.Replace(ServiceDescriptor.Singleton(instance)); + + public static IServiceCollection AddLazySupport(this IServiceCollection services) + { + services.Replace(ServiceDescriptor.Transient(typeof(Lazy<>), typeof(LazyResolve<>))); + return services; + } + } +} diff --git a/src/Umbraco.Core/ServiceProviderExtensions.cs b/src/Umbraco.Core/ServiceProviderExtensions.cs new file mode 100644 index 0000000000..e0d3da2c03 --- /dev/null +++ b/src/Umbraco.Core/ServiceProviderExtensions.cs @@ -0,0 +1,86 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using Microsoft.Extensions.DependencyInjection; +using Umbraco.Core.Composing; + +namespace Umbraco.Core +{ + /// + /// Provides extension methods to the class. + /// + public static class ServiceProviderExtensions + { + + /// + /// Creates an instance with arguments. + /// + /// The type of the instance. + /// The factory. + /// Arguments. + /// An instance of the specified type. + /// + /// Throws an exception if the factory failed to get an instance of the specified type. + /// The arguments are used as dependencies by the factory. + /// + public static T CreateInstance(this IServiceProvider serviceProvider, params object[] args) + where T : class + => (T)serviceProvider.CreateInstance(typeof(T), args); + + /// + /// Creates an instance of a service, with arguments. + /// + /// + /// The type of the instance. + /// Named arguments. + /// An instance of the specified type. + /// + /// The instance type does not need to be registered into the factory. + /// The arguments are used as dependencies by the factory. Other dependencies + /// are retrieved from the factory. + /// + public static object CreateInstance(this IServiceProvider serviceProvider, Type type, params object[] args) + { + // LightInject has this, but then it requires RegisterConstructorDependency etc and has various oddities + // including the most annoying one, which is that it does not work on singletons (hard to fix) + //return factory.GetInstance(type, args); + + // this method is essentially used to build singleton instances, so it is assumed that it would be + // more expensive to build and cache a dynamic method ctor than to simply invoke the ctor, as we do + // here - this can be discussed + + // TODO: we currently try the ctor with most parameters, but we could want to fall back to others + + //var ctor = type.GetConstructors(BindingFlags.Instance | BindingFlags.Public).OrderByDescending(x => x.GetParameters().Length).FirstOrDefault(); + //if (ctor == null) throw new InvalidOperationException($"Could not find a public constructor for type {type.FullName}."); + + //var ctorParameters = ctor.GetParameters(); + //var ctorArgs = new object[ctorParameters.Length]; + //var availableArgs = new List(args); + //var i = 0; + //foreach (var parameter in ctorParameters) + //{ + // // no! IsInstanceOfType is not ok here + // // ReSharper disable once UseMethodIsInstanceOfType + // var idx = availableArgs.FindIndex(a => parameter.ParameterType.IsAssignableFrom(a.GetType())); + // if (idx >= 0) + // { + // // Found a suitable supplied argument + // ctorArgs[i++] = availableArgs[idx]; + + // // A supplied argument can be used at most once + // availableArgs.RemoveAt(idx); + // } + // else + // { + // // None of the provided arguments is suitable: get an instance from the factory + // ctorArgs[i++] = serviceProvider.GetRequiredService(parameter.ParameterType); + // } + //} + //return ctor.Invoke(ctorArgs); + + return ActivatorUtilities.CreateInstance(serviceProvider, type, args); + } + } +} diff --git a/src/Umbraco.Core/Tour/TourFilterCollectionBuilder.cs b/src/Umbraco.Core/Tour/TourFilterCollectionBuilder.cs index 0d2f605cb1..eac519494a 100644 --- a/src/Umbraco.Core/Tour/TourFilterCollectionBuilder.cs +++ b/src/Umbraco.Core/Tour/TourFilterCollectionBuilder.cs @@ -15,7 +15,7 @@ namespace Umbraco.Web.Tour private readonly HashSet _instances = new HashSet(); /// - protected override IEnumerable CreateItems(IFactory factory) + protected override IEnumerable CreateItems(IServiceProvider factory) { return base.CreateItems(factory).Concat(_instances); } diff --git a/src/Umbraco.Examine.Lucene/ExamineLuceneComposer.cs b/src/Umbraco.Examine.Lucene/ExamineLuceneComposer.cs index b1254a4beb..b0da33569c 100644 --- a/src/Umbraco.Examine.Lucene/ExamineLuceneComposer.cs +++ b/src/Umbraco.Examine.Lucene/ExamineLuceneComposer.cs @@ -17,10 +17,10 @@ namespace Umbraco.Examine base.Compose(composition); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); } } } diff --git a/src/Umbraco.Infrastructure/Cache/DistributedCacheBinderComposer.cs b/src/Umbraco.Infrastructure/Cache/DistributedCacheBinderComposer.cs index 86f70798d7..3e99d453fa 100644 --- a/src/Umbraco.Infrastructure/Cache/DistributedCacheBinderComposer.cs +++ b/src/Umbraco.Infrastructure/Cache/DistributedCacheBinderComposer.cs @@ -14,7 +14,7 @@ namespace Umbraco.Web.Cache { base.Compose(composition); - composition.RegisterUnique(); + composition.Services.AddUnique(); } } } diff --git a/src/Umbraco.Infrastructure/Compose/DatabaseServerRegistrarAndMessengerComponent.cs b/src/Umbraco.Infrastructure/Compose/DatabaseServerRegistrarAndMessengerComponent.cs index 420730d779..9cd2b187d5 100644 --- a/src/Umbraco.Infrastructure/Compose/DatabaseServerRegistrarAndMessengerComponent.cs +++ b/src/Umbraco.Infrastructure/Compose/DatabaseServerRegistrarAndMessengerComponent.cs @@ -1,5 +1,6 @@ using System; using System.Threading; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Umbraco.Core; using Umbraco.Core.Composing; @@ -35,7 +36,7 @@ namespace Umbraco.Web.Compose public sealed class DatabaseServerRegistrarAndMessengerComposer : ComponentComposer, ICoreComposer { - public static DatabaseServerMessengerOptions GetDefaultOptions(IFactory factory) + public static DatabaseServerMessengerOptions GetDefaultOptions(IServiceProvider factory) { return new DatabaseServerMessengerOptions { diff --git a/src/Umbraco.Infrastructure/Compose/NotificationsComposer.cs b/src/Umbraco.Infrastructure/Compose/NotificationsComposer.cs index 7b4bebf878..a483b170de 100644 --- a/src/Umbraco.Infrastructure/Compose/NotificationsComposer.cs +++ b/src/Umbraco.Infrastructure/Compose/NotificationsComposer.cs @@ -10,7 +10,7 @@ namespace Umbraco.Web.Compose { base.Compose(composition); - composition.RegisterUnique(); + composition.Services.AddUnique(); } } } diff --git a/src/Umbraco.Infrastructure/Composing/CompositionExtensions/CoreMappingProfiles.cs b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/CoreMappingProfiles.cs index fc2f8c9e88..823f8618ad 100644 --- a/src/Umbraco.Infrastructure/Composing/CompositionExtensions/CoreMappingProfiles.cs +++ b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/CoreMappingProfiles.cs @@ -15,7 +15,7 @@ namespace Umbraco.Core.Composing.CompositionExtensions /// public static Composition ComposeCoreMappingProfiles(this Composition composition) { - composition.RegisterUnique(); + composition.Services.AddUnique(); composition.WithCollectionBuilder() .Add() diff --git a/src/Umbraco.Infrastructure/Composing/CompositionExtensions/FileSystems.cs b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/FileSystems.cs index b19558ef44..a4286bd719 100644 --- a/src/Umbraco.Infrastructure/Composing/CompositionExtensions/FileSystems.cs +++ b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/FileSystems.cs @@ -1,4 +1,5 @@ -using Microsoft.Extensions.Logging; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Umbraco.Core.Configuration.Models; using Umbraco.Core.Hosting; @@ -14,10 +15,13 @@ namespace Umbraco.Core.Composing.CompositionExtensions * HOW TO REPLACE THE MEDIA UNDERLYING FILESYSTEM * ---------------------------------------------- * - * composition.RegisterUnique(factoryMethod); + * Create an implementation of IFileSystem and register it as the underlying filesystem for + * MediaFileSystem with the following extension on composition. * - * composition.RegisterUnique(); + * composition.SetMediaFileSystem(factory => FactoryMethodToReturnYourImplementation()) * + * Alternatively you can just register an Implementation of IMediaFileSystem, however the + * extension above ensures that your IFileSystem implementation is wrapped by the "ShadowWrapper". * * WHAT IS SHADOWING * ----------------- @@ -27,7 +31,6 @@ namespace Umbraco.Core.Composing.CompositionExtensions * compared to creating your own physical filesystem, ensures that your filesystem * would participate into such transactions. * - * */ public static Composition ComposeFileSystems(this Composition composition) @@ -36,16 +39,15 @@ namespace Umbraco.Core.Composing.CompositionExtensions // it needs to be registered (not only the interface) because it provides additional // functionality eg for scoping, and is injected in the scope provider - whereas the // interface is really for end-users to get access to filesystems. - composition.RegisterUnique(factory => factory.CreateInstance(factory)); + composition.Services.AddUnique(factory => factory.CreateInstance(factory)); // register IFileSystems, which gives access too all filesystems - composition.RegisterUnique(factory => factory.GetRequiredService()); + composition.Services.AddUnique(factory => factory.GetRequiredService()); // register the scheme for media paths - composition.RegisterUnique(); + composition.Services.AddUnique(); - // register the default IMediaFileSystem implementation - composition.RegisterUnique(factory => + composition.SetMediaFileSystem(factory => { var ioHelper = factory.GetRequiredService(); var hostingEnvironment = factory.GetRequiredService(); @@ -54,10 +56,7 @@ namespace Umbraco.Core.Composing.CompositionExtensions var rootPath = hostingEnvironment.MapPathWebRoot(globalSettings.UmbracoMediaPath); var rootUrl = hostingEnvironment.ToAbsolute(globalSettings.UmbracoMediaPath); - var inner = new PhysicalFileSystem(ioHelper, hostingEnvironment, logger, rootPath, rootUrl); - - var fileSystems = factory.GetRequiredService(); - return fileSystems.GetFileSystem(inner); + return new PhysicalFileSystem(ioHelper, hostingEnvironment, logger, rootPath, rootUrl); }); return composition; diff --git a/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Installer.cs b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Installer.cs index 403e13816e..7e64b0698c 100644 --- a/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Installer.cs +++ b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Installer.cs @@ -28,7 +28,7 @@ namespace Umbraco.Web.Composing.CompositionExtensions composition.Services.AddScoped(); composition.Services.AddTransient(); - composition.RegisterUnique(); + composition.Services.AddUnique(); return composition; } diff --git a/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Repositories.cs b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Repositories.cs index 9a23255cc4..8d15b5761a 100644 --- a/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Repositories.cs +++ b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Repositories.cs @@ -11,45 +11,45 @@ namespace Umbraco.Core.Composing.CompositionExtensions public static Composition ComposeRepositories(this Composition composition) { // repositories - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); return composition; } diff --git a/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Services.cs b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Services.cs index 37c0bae384..c6106b2191 100644 --- a/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Services.cs +++ b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Services.cs @@ -1,6 +1,7 @@ using System; using System.IO; using System.Linq; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Microsoft.Extensions.Logging; using Umbraco.Core.Cache; @@ -22,58 +23,58 @@ namespace Umbraco.Core.Composing.CompositionExtensions { // register a transient messages factory, which will be replaced by the web // boot manager when running in a web context - composition.RegisterUnique(); + composition.Services.AddUnique(); // register the service context - composition.RegisterUnique(); + composition.Services.AddUnique(); // register the special idk map - composition.RegisterUnique(); + composition.Services.AddUnique(); // register the services - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.Register(SourcesFactory); - composition.RegisterUnique(factory => new LocalizedTextService( + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddTransient(SourcesFactory); + composition.Services.AddUnique(factory => new LocalizedTextService( factory.GetRequiredService>(), factory.GetRequiredService>())); - composition.RegisterUnique(); + composition.Services.AddUnique(); - composition.RegisterUnique(); + composition.Services.AddUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(factory => CreatePackageRepository(factory, "createdPackages.config")); - composition.RegisterUnique(factory => CreatePackageRepository(factory, "installedPackages.config")); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(factory => CreatePackageRepository(factory, "createdPackages.config")); + composition.Services.AddUnique(factory => CreatePackageRepository(factory, "installedPackages.config")); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); return composition; } @@ -84,7 +85,7 @@ namespace Umbraco.Core.Composing.CompositionExtensions /// /// /// - private static PackagesRepository CreatePackageRepository(IFactory factory, string packageRepoFileName) + private static PackagesRepository CreatePackageRepository(IServiceProvider factory, string packageRepoFileName) => new PackagesRepository( factory.GetRequiredService(), factory.GetRequiredService(), @@ -99,7 +100,7 @@ namespace Umbraco.Core.Composing.CompositionExtensions factory.GetRequiredService>(), packageRepoFileName); - private static LocalizedTextServiceFileSources SourcesFactory(IFactory container) + private static LocalizedTextServiceFileSources SourcesFactory(IServiceProvider container) { var hostingEnvironment = container.GetRequiredService(); var globalSettings = container.GetRequiredService>().Value; diff --git a/src/Umbraco.Infrastructure/CompositionExtensions.cs b/src/Umbraco.Infrastructure/CompositionExtensions.cs index 6ba5c34505..aa351657c5 100644 --- a/src/Umbraco.Infrastructure/CompositionExtensions.cs +++ b/src/Umbraco.Infrastructure/CompositionExtensions.cs @@ -1,4 +1,5 @@ using System; +using Microsoft.Extensions.DependencyInjection; using Umbraco.Core.Cache; using Umbraco.Core.Composing; using Umbraco.Core.Dictionary; @@ -111,9 +112,9 @@ namespace Umbraco.Core /// The type of the factory. /// The composition. public static void SetCultureDictionaryFactory(this Composition composition) - where T : ICultureDictionaryFactory + where T : class, ICultureDictionaryFactory { - composition.RegisterUnique(); + composition.Services.AddUnique(); } /// @@ -121,9 +122,9 @@ namespace Umbraco.Core /// /// The composition. /// A function creating a culture dictionary factory. - public static void SetCultureDictionaryFactory(this Composition composition, Func factory) + public static void SetCultureDictionaryFactory(this Composition composition, Func factory) { - composition.RegisterUnique(factory); + composition.Services.AddUnique(factory); } /// @@ -133,7 +134,7 @@ namespace Umbraco.Core /// A factory. public static void SetCultureDictionaryFactory(this Composition composition, ICultureDictionaryFactory factory) { - composition.RegisterUnique(_ => factory); + composition.Services.AddUnique(_ => factory); } /// @@ -142,9 +143,9 @@ namespace Umbraco.Core /// The type of the factory. /// The composition. public static void SetPublishedContentModelFactory(this Composition composition) - where T : IPublishedModelFactory + where T : class, IPublishedModelFactory { - composition.RegisterUnique(); + composition.Services.AddUnique(); } /// @@ -152,9 +153,9 @@ namespace Umbraco.Core /// /// The composition. /// A function creating a published content model factory. - public static void SetPublishedContentModelFactory(this Composition composition, Func factory) + public static void SetPublishedContentModelFactory(this Composition composition, Func factory) { - composition.RegisterUnique(factory); + composition.Services.AddUnique(factory); } /// @@ -164,7 +165,7 @@ namespace Umbraco.Core /// A published content model factory. public static void SetPublishedContentModelFactory(this Composition composition, IPublishedModelFactory factory) { - composition.RegisterUnique(_ => factory); + composition.Services.AddUnique(_ => factory); } /// @@ -173,9 +174,9 @@ namespace Umbraco.Core /// The type of the server registrar. /// The composition. public static void SetServerRegistrar(this Composition composition) - where T : IServerRegistrar + where T : class, IServerRegistrar { - composition.RegisterUnique(); + composition.Services.AddUnique(); } /// @@ -183,9 +184,9 @@ namespace Umbraco.Core /// /// The composition. /// A function creating a server registrar. - public static void SetServerRegistrar(this Composition composition, Func factory) + public static void SetServerRegistrar(this Composition composition, Func factory) { - composition.RegisterUnique(factory); + composition.Services.AddUnique(factory); } /// @@ -195,7 +196,7 @@ namespace Umbraco.Core /// A server registrar. public static void SetServerRegistrar(this Composition composition, IServerRegistrar registrar) { - composition.RegisterUnique(_ => registrar); + composition.Services.AddUnique(_ => registrar); } /// @@ -204,9 +205,9 @@ namespace Umbraco.Core /// The type of the server registrar. /// The composition. public static void SetServerMessenger(this Composition composition) - where T : IServerMessenger + where T : class, IServerMessenger { - composition.RegisterUnique(); + composition.Services.AddUnique(); } /// @@ -214,9 +215,9 @@ namespace Umbraco.Core /// /// The composition. /// A function creating a server messenger. - public static void SetServerMessenger(this Composition composition, Func factory) + public static void SetServerMessenger(this Composition composition, Func factory) { - composition.RegisterUnique(factory); + composition.Services.AddUnique(factory); } /// @@ -226,7 +227,7 @@ namespace Umbraco.Core /// A server messenger. public static void SetServerMessenger(this Composition composition, IServerMessenger registrar) { - composition.RegisterUnique(_ => registrar); + composition.Services.AddUnique(_ => registrar); } /// @@ -235,9 +236,9 @@ namespace Umbraco.Core /// The composition. /// A function creating the options. /// Use DatabaseServerRegistrarAndMessengerComposer.GetDefaultOptions to get the options that Umbraco would use by default. - public static void SetDatabaseServerMessengerOptions(this Composition composition, Func factory) + public static void SetDatabaseServerMessengerOptions(this Composition composition, Func factory) { - composition.RegisterUnique(factory); + composition.Services.AddUnique(factory); } /// @@ -248,7 +249,7 @@ namespace Umbraco.Core /// Use DatabaseServerRegistrarAndMessengerComposer.GetDefaultOptions to get the options that Umbraco would use by default. public static void SetDatabaseServerMessengerOptions(this Composition composition, DatabaseServerMessengerOptions options) { - composition.RegisterUnique(_ => options); + composition.Services.AddUnique(_ => options); } /// @@ -257,9 +258,9 @@ namespace Umbraco.Core /// The type of the short string helper. /// The composition. public static void SetShortStringHelper(this Composition composition) - where T : IShortStringHelper + where T : class, IShortStringHelper { - composition.RegisterUnique(); + composition.Services.AddUnique(); } /// @@ -267,9 +268,9 @@ namespace Umbraco.Core /// /// The composition. /// A function creating a short string helper. - public static void SetShortStringHelper(this Composition composition, Func factory) + public static void SetShortStringHelper(this Composition composition, Func factory) { - composition.RegisterUnique(factory); + composition.Services.AddUnique(factory); } /// @@ -279,18 +280,33 @@ namespace Umbraco.Core /// A short string helper. public static void SetShortStringHelper(this Composition composition, IShortStringHelper helper) { - composition.RegisterUnique(_ => helper); + composition.Services.AddUnique(_ => helper); } + /// + /// Sets the underlying media filesystem. + /// + /// A composition. + /// A filesystem factory. + /// + /// Using this helper will ensure that your IFileSystem implementation is wrapped by the ShadowWrapper + /// + public static void SetMediaFileSystem(this Composition composition, Func filesystemFactory) + => composition.Services.AddUnique(factory => + { + var fileSystems = factory.GetRequiredService(); + return fileSystems.GetFileSystem(filesystemFactory(factory)); + }); + /// /// Sets the log viewer. /// /// The type of the log viewer. /// The composition. public static void SetLogViewer(this Composition composition) - where T : ILogViewer + where T : class, ILogViewer { - composition.RegisterUnique(); + composition.Services.AddUnique(); } /// @@ -298,9 +314,9 @@ namespace Umbraco.Core /// /// The composition. /// A function creating a log viewer. - public static void SetLogViewer(this Composition composition, Func factory) + public static void SetLogViewer(this Composition composition, Func factory) { - composition.RegisterUnique(factory); + composition.Services.AddUnique(factory); } /// @@ -310,7 +326,7 @@ namespace Umbraco.Core /// A log viewer. public static void SetLogViewer(this Composition composition, ILogViewer viewer) { - composition.RegisterUnique(_ => viewer); + composition.Services.AddUnique(_ => viewer); } #endregion diff --git a/src/Umbraco.Infrastructure/CompositionExtensions_Essentials.cs b/src/Umbraco.Infrastructure/CompositionExtensions_Essentials.cs index 630d0970bd..d254139a04 100644 --- a/src/Umbraco.Infrastructure/CompositionExtensions_Essentials.cs +++ b/src/Umbraco.Infrastructure/CompositionExtensions_Essentials.cs @@ -1,4 +1,5 @@ -using Microsoft.Extensions.Logging; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; using Umbraco.Core.Cache; using Umbraco.Core.Composing; using Umbraco.Core.Configuration; @@ -38,24 +39,24 @@ namespace Umbraco.Core IHostingEnvironment hostingEnvironment, IBackOfficeInfo backOfficeInfo) { - composition.RegisterUnique(logger); - composition.RegisterUnique(loggerFactory); - composition.RegisterUnique(profiler); - composition.RegisterUnique(profilingLogger); - composition.RegisterUnique(mainDom); - composition.RegisterUnique(appCaches); - composition.RegisterUnique(appCaches.RequestCache); - composition.RegisterUnique(databaseFactory); - composition.RegisterUnique(factory => factory.GetRequiredService().SqlContext); - composition.RegisterUnique(typeLoader); - composition.RegisterUnique(state); - composition.RegisterUnique(typeFinder); - composition.RegisterUnique(ioHelper); - composition.RegisterUnique(umbracoVersion); - composition.RegisterUnique(dbProviderFactoryCreator); - composition.RegisterUnique(factory => factory.GetRequiredService().BulkSqlInsertProvider); - composition.RegisterUnique(hostingEnvironment); - composition.RegisterUnique(backOfficeInfo); + composition.Services.AddUnique(logger); + composition.Services.AddUnique(loggerFactory); + composition.Services.AddUnique(profiler); + composition.Services.AddUnique(profilingLogger); + composition.Services.AddUnique(mainDom); + composition.Services.AddUnique(appCaches); + composition.Services.AddUnique(appCaches.RequestCache); + composition.Services.AddUnique(databaseFactory); + composition.Services.AddUnique(factory => factory.GetRequiredService().SqlContext); + composition.Services.AddUnique(typeLoader); + composition.Services.AddUnique(state); + composition.Services.AddUnique(typeFinder); + composition.Services.AddUnique(ioHelper); + composition.Services.AddUnique(umbracoVersion); + composition.Services.AddUnique(dbProviderFactoryCreator); + composition.Services.AddUnique(factory => factory.GetRequiredService().BulkSqlInsertProvider); + composition.Services.AddUnique(hostingEnvironment); + composition.Services.AddUnique(backOfficeInfo); } } } diff --git a/src/Umbraco.Infrastructure/Logging/Serilog/SerilogComposer.cs b/src/Umbraco.Infrastructure/Logging/Serilog/SerilogComposer.cs index 18b417d428..59c9b47400 100644 --- a/src/Umbraco.Infrastructure/Logging/Serilog/SerilogComposer.cs +++ b/src/Umbraco.Infrastructure/Logging/Serilog/SerilogComposer.cs @@ -12,10 +12,10 @@ namespace Umbraco.Infrastructure.Logging.Serilog { public void Compose(Composition composition) { - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); } } } diff --git a/src/Umbraco.Infrastructure/Logging/Viewer/LogViewerComposer.cs b/src/Umbraco.Infrastructure/Logging/Viewer/LogViewerComposer.cs index 2c0f995236..6941647dfc 100644 --- a/src/Umbraco.Infrastructure/Logging/Viewer/LogViewerComposer.cs +++ b/src/Umbraco.Infrastructure/Logging/Viewer/LogViewerComposer.cs @@ -1,4 +1,5 @@ using System.IO; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Serilog; using Umbraco.Core.Composing; @@ -12,9 +13,9 @@ namespace Umbraco.Core.Logging.Viewer { public void Compose(Composition composition) { - composition.RegisterUnique(); + composition.Services.AddUnique(); composition.SetLogViewer(); - composition.RegisterUnique(factory => + composition.Services.AddUnique(factory => { return new SerilogJsonLogViewer(factory.GetRequiredService>(), diff --git a/src/Umbraco.Infrastructure/Migrations/MigrationBuilder.cs b/src/Umbraco.Infrastructure/Migrations/MigrationBuilder.cs index d2d2b7d32a..9fc5b1b277 100644 --- a/src/Umbraco.Infrastructure/Migrations/MigrationBuilder.cs +++ b/src/Umbraco.Infrastructure/Migrations/MigrationBuilder.cs @@ -5,9 +5,9 @@ namespace Umbraco.Core.Migrations { public class MigrationBuilder : IMigrationBuilder { - private readonly IFactory _container; + private readonly IServiceProvider _container; - public MigrationBuilder(IFactory container) + public MigrationBuilder(IServiceProvider container) { _container = container; } diff --git a/src/Umbraco.Infrastructure/Persistence/Mappers/MapperCollectionBuilder.cs b/src/Umbraco.Infrastructure/Persistence/Mappers/MapperCollectionBuilder.cs index 77f5b627bb..b5b295299d 100644 --- a/src/Umbraco.Infrastructure/Persistence/Mappers/MapperCollectionBuilder.cs +++ b/src/Umbraco.Infrastructure/Persistence/Mappers/MapperCollectionBuilder.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Concurrent; +using Microsoft.Extensions.DependencyInjection; using Umbraco.Core.Composing; using Umbraco.Infrastructure.Persistence.Mappers; @@ -9,9 +10,9 @@ namespace Umbraco.Core.Persistence.Mappers { protected override MapperCollectionBuilder This => this; - public override void RegisterWith(IRegister register) + public override void RegisterWith(IServiceCollection services) { - base.RegisterWith(register); + base.RegisterWith(services); // default initializer registers // - service MapperCollectionBuilder, returns MapperCollectionBuilder @@ -19,8 +20,8 @@ namespace Umbraco.Core.Persistence.Mappers // we want to register extra // - service IMapperCollection, returns MappersCollectionBuilder's collection - register.Register(Lifetime.Singleton); - register.Register(factory => factory.GetRequiredService()); + services.AddSingleton(); + services.AddSingleton(factory => factory.GetRequiredService()); } public MapperCollectionBuilder AddCoreMappers() diff --git a/src/Umbraco.Infrastructure/Runtime/CoreInitialComposer.cs b/src/Umbraco.Infrastructure/Runtime/CoreInitialComposer.cs index 70e29fd443..8ce59b49e7 100644 --- a/src/Umbraco.Infrastructure/Runtime/CoreInitialComposer.cs +++ b/src/Umbraco.Infrastructure/Runtime/CoreInitialComposer.cs @@ -86,20 +86,20 @@ namespace Umbraco.Core.Runtime composition.Mappers().AddCoreMappers(); // register the scope provider - composition.RegisterUnique(); // implements both IScopeProvider and IScopeAccessor - composition.RegisterUnique(f => f.GetRequiredService()); - composition.RegisterUnique(f => f.GetRequiredService()); + composition.Services.AddUnique(); // implements both IScopeProvider and IScopeAccessor + composition.Services.AddUnique(f => f.GetRequiredService()); + composition.Services.AddUnique(f => f.GetRequiredService()); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); // register database builder // *not* a singleton, don't want to keep it around composition.Services.AddTransient(); // register manifest parser, will be injected in collection builders where needed - composition.RegisterUnique(); + composition.Services.AddUnique(); // register our predefined validators composition.ManifestValueValidators() @@ -121,15 +121,15 @@ namespace Umbraco.Core.Runtime .Add() .Add(); - composition.RegisterUnique(); - composition.RegisterUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); // Used to determine if a datatype/editor should be storing/tracking // references to media item/s composition.DataValueReferenceFactories(); // register a server registrar, by default it's the db registrar - composition.RegisterUnique(f => + composition.Services.AddUnique(f => { var globalSettings = f.GetRequiredService>().Value; @@ -146,7 +146,7 @@ namespace Umbraco.Core.Runtime // by default we'll use the database server messenger with default options (no callbacks), // this will be overridden by the db thing in the corresponding components in the web // project - composition.RegisterUnique(factory + composition.Services.AddUnique(factory => new DatabaseServerMessenger( factory.GetRequiredService(), factory.GetRequiredService(), @@ -168,56 +168,56 @@ namespace Umbraco.Core.Runtime composition.PropertyValueConverters() .Append(composition.TypeLoader.GetTypes()); - composition.RegisterUnique(); + composition.Services.AddUnique(); - composition.RegisterUnique(factory + composition.Services.AddUnique(factory => new DefaultShortStringHelper(new DefaultShortStringHelperConfig().WithDefault(factory.GetRequiredService>().Value))); composition.UrlSegmentProviders() .Append(); - composition.RegisterUnique(factory => new MigrationBuilder(factory)); + composition.Services.AddUnique(factory => new MigrationBuilder(factory)); // by default, register a noop factory - composition.RegisterUnique(); + composition.Services.AddUnique(); // by default - composition.RegisterUnique(); + composition.Services.AddUnique(); composition.SetCultureDictionaryFactory(); - composition.Register(f => f.GetRequiredService().CreateDictionary(), Lifetime.Singleton); - composition.RegisterUnique(); + composition.Services.AddSingleton(f => f.GetRequiredService().CreateDictionary()); + composition.Services.AddUnique(); // register the published snapshot accessor - the "current" published snapshot is in the umbraco context - composition.RegisterUnique(); + composition.Services.AddUnique(); - composition.RegisterUnique(); + composition.Services.AddUnique(); - composition.RegisterUnique(); + composition.Services.AddUnique(); // register core CMS dashboards and 3rd party types - will be ordered by weight attribute & merged with package.manifest dashboards composition.Dashboards() .Add(composition.TypeLoader.GetTypes()); // will be injected in controllers when needed to invoke rest endpoints on Our - composition.RegisterUnique(); - composition.RegisterUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); // Grid config is not a real config file as we know them - composition.RegisterUnique(); + composition.Services.AddUnique(); // Config manipulator - composition.RegisterUnique(); + composition.Services.AddUnique(); // register the umbraco context factory - // composition.RegisterUnique(); - composition.RegisterUnique(); + // composition.Services.AddUnique(); + composition.Services.AddUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); // both TinyMceValueConverter (in Core) and RteMacroRenderingValueConverter (in Web) will be // discovered when CoreBootManager configures the converters. We HAVE to remove one of them @@ -236,14 +236,14 @@ namespace Umbraco.Core.Runtime composition.MediaUrlProviders() .Append(); - composition.RegisterUnique(); + composition.Services.AddUnique(); // register properties fallback - composition.RegisterUnique(); + composition.Services.AddUnique(); - composition.RegisterUnique(); + composition.Services.AddUnique(); - composition.RegisterUnique(); + composition.Services.AddUnique(); composition.Actions() .Add(() => composition.TypeLoader.GetTypes()); @@ -255,7 +255,7 @@ namespace Umbraco.Core.Runtime composition.TourFilters(); // replace with web implementation - composition.RegisterUnique(); + composition.Services.AddUnique(); // register OEmbed providers - no type scanning - all explicit opt-in of adding types // note: IEmbedProvider is not IDiscoverable - think about it if going for type scanning @@ -297,7 +297,7 @@ namespace Umbraco.Core.Runtime .Append(); // register published router - composition.RegisterUnique(); + composition.Services.AddUnique(); // register *all* checks, except those marked [HideFromTypeFinder] of course composition.HealthChecks() @@ -307,7 +307,7 @@ namespace Umbraco.Core.Runtime composition.WithCollectionBuilder() .Add(() => composition.TypeLoader.GetTypes()); - composition.RegisterUnique(); + composition.Services.AddUnique(); composition.ContentFinders() // all built-in finders in the correct order, @@ -325,52 +325,52 @@ namespace Umbraco.Core.Runtime .Add(() => composition.TypeLoader.GetTypes()); // replace some services - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); - composition.RegisterUnique(); + composition.Services.AddUnique(); // register distributed cache - composition.RegisterUnique(f => new DistributedCache(f.GetRequiredService(), f.GetRequiredService())); + composition.Services.AddUnique(f => new DistributedCache(f.GetRequiredService(), f.GetRequiredService())); composition.Services.AddScoped(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); - composition.RegisterUnique(); - composition.Register(factory => + composition.Services.AddUnique(); + composition.Services.AddScoped(factory => { var umbCtx = factory.GetRequiredService(); return new PublishedContentQuery(umbCtx.UmbracoContext.PublishedSnapshot, factory.GetRequiredService(), factory.GetRequiredService()); - }, Lifetime.Request); + }); - composition.RegisterUnique(); + composition.Services.AddUnique(); // register the http context and umbraco context accessors // we *should* use the HttpContextUmbracoContextAccessor, however there are cases when // we have no http context, eg when booting Umbraco or in background threads, so instead // let's use an hybrid accessor that can fall back to a ThreadStatic context. - composition.RegisterUnique(); + composition.Services.AddUnique(); // register accessors for cultures - composition.RegisterUnique(); + composition.Services.AddUnique(); composition.Services.AddSingleton(); - composition.RegisterUnique(); + composition.Services.AddUnique(); // Register noop versions for examine to be overridden by examine - composition.RegisterUnique(); - composition.RegisterUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); - composition.RegisterUnique(); + composition.Services.AddUnique(); } } } diff --git a/src/Umbraco.Infrastructure/Runtime/CoreRuntime.cs b/src/Umbraco.Infrastructure/Runtime/CoreRuntime.cs index b226169f12..dae8bcbf69 100644 --- a/src/Umbraco.Infrastructure/Runtime/CoreRuntime.cs +++ b/src/Umbraco.Infrastructure/Runtime/CoreRuntime.cs @@ -16,7 +16,6 @@ using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.Mappers; -using Umbraco.Infrastructure.Composing; namespace Umbraco.Core.Runtime { @@ -185,7 +184,7 @@ namespace Umbraco.Core.Runtime composition.RegisterEssentials(Logger, RuntimeLoggerFactory, Profiler, ProfilingLogger, MainDom, AppCaches, databaseFactory, typeLoader, _state, TypeFinder, IOHelper, UmbracoVersion, DbProviderFactoryCreator, HostingEnvironment, BackOfficeInfo); // register ourselves (TODO: Should we put this in RegisterEssentials?) - composition.Register(_ => this, Lifetime.Singleton); + composition.Services.AddSingleton(_ => this); // run handlers OnRuntimeEssentials(composition, AppCaches, typeLoader, databaseFactory); diff --git a/src/Umbraco.Infrastructure/Search/ExamineComposer.cs b/src/Umbraco.Infrastructure/Search/ExamineComposer.cs index 58de71d920..24e32949ae 100644 --- a/src/Umbraco.Infrastructure/Search/ExamineComposer.cs +++ b/src/Umbraco.Infrastructure/Search/ExamineComposer.cs @@ -29,9 +29,9 @@ namespace Umbraco.Web.Search composition.Services.AddSingleton(); composition.Services.AddSingleton(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(factory => + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(factory => new ContentValueSetBuilder( factory.GetRequiredService(), factory.GetRequiredService(), @@ -39,7 +39,7 @@ namespace Umbraco.Web.Search factory.GetRequiredService(), factory.GetRequiredService(), true)); - composition.RegisterUnique(factory => + composition.Services.AddUnique(factory => new ContentValueSetBuilder( factory.GetRequiredService(), factory.GetRequiredService(), @@ -47,9 +47,9 @@ namespace Umbraco.Web.Search factory.GetRequiredService(), factory.GetRequiredService(), false)); - composition.RegisterUnique, MediaValueSetBuilder>(); - composition.RegisterUnique, MemberValueSetBuilder>(); - composition.RegisterUnique(); + composition.Services.AddUnique, MediaValueSetBuilder>(); + composition.Services.AddUnique, MemberValueSetBuilder>(); + composition.Services.AddUnique(); } } } diff --git a/src/Umbraco.Infrastructure/Search/SearchableTreeCollectionBuilder.cs b/src/Umbraco.Infrastructure/Search/SearchableTreeCollectionBuilder.cs index 847264ee03..a5e940b4a6 100644 --- a/src/Umbraco.Infrastructure/Search/SearchableTreeCollectionBuilder.cs +++ b/src/Umbraco.Infrastructure/Search/SearchableTreeCollectionBuilder.cs @@ -1,4 +1,5 @@ -using Umbraco.Core.Composing; +using Microsoft.Extensions.DependencyInjection; +using Umbraco.Core.Composing; using Umbraco.Web.Trees; namespace Umbraco.Web.Search @@ -8,6 +9,6 @@ namespace Umbraco.Web.Search protected override SearchableTreeCollectionBuilder This => this; //per request because generally an instance of ISearchableTree is a controller - protected override Lifetime CollectionLifetime => Lifetime.Request; + protected override ServiceLifetime CollectionLifetime => ServiceLifetime.Scoped; } } diff --git a/src/Umbraco.Infrastructure/WebAssets/WebAssetsComposer.cs b/src/Umbraco.Infrastructure/WebAssets/WebAssetsComposer.cs index bea056c69c..b907d07627 100644 --- a/src/Umbraco.Infrastructure/WebAssets/WebAssetsComposer.cs +++ b/src/Umbraco.Infrastructure/WebAssets/WebAssetsComposer.cs @@ -8,7 +8,7 @@ namespace Umbraco.Web.WebAssets public override void Compose(Composition composition) { base.Compose(composition); - composition.RegisterUnique(); + composition.Services.AddUnique(); } } } diff --git a/src/Umbraco.ModelsBuilder.Embedded/Compose/ModelsBuilderComposer.cs b/src/Umbraco.ModelsBuilder.Embedded/Compose/ModelsBuilderComposer.cs index f72f3e6de2..03d90616ba 100644 --- a/src/Umbraco.ModelsBuilder.Embedded/Compose/ModelsBuilderComposer.cs +++ b/src/Umbraco.ModelsBuilder.Embedded/Compose/ModelsBuilderComposer.cs @@ -20,13 +20,13 @@ namespace Umbraco.ModelsBuilder.Embedded.Compose { composition.Components().Append(); composition.Services.AddSingleton(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(factory => + composition.Services.AddUnique(); + composition.Services.AddUnique(factory => { var config = factory.GetRequiredService>().Value; if (config.ModelsMode == ModelsMode.PureLive) diff --git a/src/Umbraco.PublishedCache.NuCache/NuCacheComposer.cs b/src/Umbraco.PublishedCache.NuCache/NuCacheComposer.cs index 8ebd9d31b9..ea8863dbd7 100644 --- a/src/Umbraco.PublishedCache.NuCache/NuCacheComposer.cs +++ b/src/Umbraco.PublishedCache.NuCache/NuCacheComposer.cs @@ -20,12 +20,12 @@ namespace Umbraco.Web.PublishedCache.NuCache // register the NuCache published snapshot service // must register default options, required in the service ctor - composition.Register(factory => new PublishedSnapshotServiceOptions()); + composition.Services.AddTransient(factory => new PublishedSnapshotServiceOptions()); composition.SetPublishedSnapshotService(); // replace this service since we want to improve the content/media // mapping lookups if we are using nucache. - composition.RegisterUnique(factory => + composition.Services.AddUnique(factory => { var idkSvc = new IdKeyMap(factory.GetRequiredService()); var publishedSnapshotService = factory.GetRequiredService() as PublishedSnapshotService; diff --git a/src/Umbraco.TestData/LoadTestController.cs b/src/Umbraco.TestData/LoadTestController.cs index 5d044d56e3..fbb031c6db 100644 --- a/src/Umbraco.TestData/LoadTestController.cs +++ b/src/Umbraco.TestData/LoadTestController.cs @@ -10,6 +10,7 @@ using System.Web.Routing; using System.Diagnostics; using Umbraco.Core.Composing; using System.Configuration; +using Microsoft.Extensions.DependencyInjection; using Umbraco.Core.Strings; // see https://github.com/Shazwazza/UmbracoScripts/tree/master/src/LoadTesting @@ -368,7 +369,7 @@ namespace Umbraco.TestData if (ConfigurationManager.AppSettings["Umbraco.TestData.Enabled"] != "true") return; - composition.Register(typeof(LoadTestController), Lifetime.Request); + composition.Services.AddScoped(typeof(LoadTestController)); } } } diff --git a/src/Umbraco.Tests.Common/TestHelperBase.cs b/src/Umbraco.Tests.Common/TestHelperBase.cs index 0357b7f4ba..095879209a 100644 --- a/src/Umbraco.Tests.Common/TestHelperBase.cs +++ b/src/Umbraco.Tests.Common/TestHelperBase.cs @@ -20,7 +20,6 @@ using Umbraco.Net; using Umbraco.Core.Persistence; using Umbraco.Core.Serialization; using Umbraco.Core.Strings; -using Umbraco.Infrastructure.Composing; using Umbraco.Web; using Umbraco.Web.Routing; using Umbraco.Tests.Common.Builders; @@ -122,9 +121,9 @@ namespace Umbraco.Tests.Common public IUmbracoVersion GetUmbracoVersion() => new UmbracoVersion(); - public IRegister GetRegister() + public IServiceCollection GetRegister() { - return ServiceCollectionRegistryAdapter.Wrap(new ServiceCollection()); + return new ServiceCollection(); } public abstract IHostingEnvironment GetHostingEnvironment(); diff --git a/src/Umbraco.Tests.Integration/RuntimeTests.cs b/src/Umbraco.Tests.Integration/RuntimeTests.cs index 88d000b3a8..4070a9ea74 100644 --- a/src/Umbraco.Tests.Integration/RuntimeTests.cs +++ b/src/Umbraco.Tests.Integration/RuntimeTests.cs @@ -12,7 +12,6 @@ using Umbraco.Core.Composing; using Umbraco.Core.Configuration.Models; using Umbraco.Core.Runtime; using Umbraco.Extensions; -using Umbraco.Infrastructure.Composing; using Umbraco.Tests.Common; using Umbraco.Tests.Integration.Extensions; using Umbraco.Tests.Integration.Implementations; @@ -45,10 +44,10 @@ namespace Umbraco.Tests.Integration public void Boot_Core_Runtime() { // TODO: MSDI - cleanup after initial merge. - var umbracoContainer = new ServiceCollectionRegistryAdapter(new ServiceCollection()); + var services = new ServiceCollection().AddLazySupport(); // Special case since we are not using the Generic Host, we need to manually add an AspNetCore service to the container - umbracoContainer.Register(x => Mock.Of()); + services.AddTransient(x => Mock.Of()); var testHelper = new TestHelper(); @@ -64,14 +63,14 @@ namespace Umbraco.Tests.Integration var userPasswordConfigurationSettings = new UserPasswordConfigurationSettings(); var webRoutingSettings = new WebRoutingSettings(); - umbracoContainer.Register(x => Options.Create(globalSettings)); - umbracoContainer.Register(x => Options.Create(contentSettings)); - umbracoContainer.Register(x => Options.Create(coreDebugSettings)); - umbracoContainer.Register(x => Options.Create(nuCacheSettings)); - umbracoContainer.Register(x => Options.Create(requestHandlerSettings)); - umbracoContainer.Register(x => Options.Create(userPasswordConfigurationSettings)); - umbracoContainer.Register(x => Options.Create(webRoutingSettings)); - umbracoContainer.Register(typeof(ILogger<>), typeof(Logger<>), Lifetime.Singleton); + services.AddTransient(x => Options.Create(globalSettings)); + services.AddTransient(x => Options.Create(contentSettings)); + services.AddTransient(x => Options.Create(coreDebugSettings)); + services.AddTransient(x => Options.Create(nuCacheSettings)); + services.AddTransient(x => Options.Create(requestHandlerSettings)); + services.AddTransient(x => Options.Create(userPasswordConfigurationSettings)); + services.AddTransient(x => Options.Create(webRoutingSettings)); + services.AddSingleton(typeof(ILogger<>), typeof(Logger<>)); // Create the core runtime var coreRuntime = new CoreRuntime(globalSettings, connectionStrings, testHelper.GetUmbracoVersion(), @@ -79,7 +78,7 @@ namespace Umbraco.Tests.Integration testHelper.GetHostingEnvironment(), testHelper.GetBackOfficeInfo(), testHelper.DbProviderFactoryCreator, testHelper.MainDom, testHelper.GetTypeFinder(), AppCaches.NoCache); - coreRuntime.Configure(umbracoContainer.Services); + coreRuntime.Configure(services); Assert.IsTrue(coreRuntime.MainDom.IsMainDom); Assert.IsNull(coreRuntime.State.BootFailedException); @@ -88,7 +87,7 @@ namespace Umbraco.Tests.Integration Assert.IsFalse(MyComponent.IsInit); Assert.IsFalse(MyComponent.IsTerminated); - coreRuntime.Start(umbracoContainer.Services.BuildServiceProvider()); + coreRuntime.Start(services.BuildServiceProvider()); Assert.IsTrue(MyComponent.IsInit); Assert.IsFalse(MyComponent.IsTerminated); @@ -116,10 +115,7 @@ namespace Umbraco.Tests.Integration // Add it! services.AddUmbracoConfiguration(hostContext.Configuration); - - // TODO: MSDI - cleanup after initial merge. - var register = new ServiceCollectionRegistryAdapter(services); - services.AddUmbracoCore(webHostEnvironment, register, GetType().Assembly, AppCaches.NoCache, testHelper.GetLoggingConfiguration(), hostContext.Configuration); + services.AddUmbracoCore(webHostEnvironment, GetType().Assembly, AppCaches.NoCache, testHelper.GetLoggingConfiguration(), hostContext.Configuration); }); var host = await hostBuilder.StartAsync(); @@ -158,9 +154,7 @@ namespace Umbraco.Tests.Integration // Add it! services.AddUmbracoConfiguration(hostContext.Configuration); - // TODO: MSDI - cleanup after initial merge. - var register = new ServiceCollectionRegistryAdapter(services); - services.AddUmbracoCore(webHostEnvironment, register, GetType().Assembly, AppCaches.NoCache, testHelper.GetLoggingConfiguration(),hostContext.Configuration); + services.AddUmbracoCore(webHostEnvironment, GetType().Assembly, AppCaches.NoCache, testHelper.GetLoggingConfiguration(),hostContext.Configuration); }); var host = await hostBuilder.StartAsync(); diff --git a/src/Umbraco.Tests.Integration/TestServerTest/UmbracoBuilderExtensions.cs b/src/Umbraco.Tests.Integration/TestServerTest/UmbracoBuilderExtensions.cs index 50918034d5..23b4b17be8 100644 --- a/src/Umbraco.Tests.Integration/TestServerTest/UmbracoBuilderExtensions.cs +++ b/src/Umbraco.Tests.Integration/TestServerTest/UmbracoBuilderExtensions.cs @@ -2,7 +2,6 @@ using Umbraco.Core.Cache; using Umbraco.Core.Runtime; using Umbraco.Extensions; -using Umbraco.Infrastructure.Composing; using Umbraco.Tests.Integration.Implementations; using Umbraco.Tests.Integration.Testing; using Umbraco.Web.Common.Builder; @@ -22,11 +21,8 @@ namespace Umbraco.Tests.Integration.TestServerTest return builder.AddWith(nameof(global::Umbraco.Web.Common.Builder.UmbracoBuilderExtensions.WithCore), () => { - // TODO: MSDI - cleanup after initial merge. - var register = new ServiceCollectionRegistryAdapter(builder.Services); builder.Services.AddUmbracoCore( builder.WebHostEnvironment, - register, typeof(UmbracoBuilderExtensions).Assembly, AppCaches.NoCache, // Disable caches in integration tests testHelper.GetLoggingConfiguration(), diff --git a/src/Umbraco.Tests.Integration/Testing/IntegrationTestComposer.cs b/src/Umbraco.Tests.Integration/Testing/IntegrationTestComposer.cs index 7e6585c2c2..1fc086c019 100644 --- a/src/Umbraco.Tests.Integration/Testing/IntegrationTestComposer.cs +++ b/src/Umbraco.Tests.Integration/Testing/IntegrationTestComposer.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Umbraco.Core; @@ -43,20 +44,20 @@ namespace Umbraco.Tests.Integration.Testing composition.Components().Remove(); composition.Components().Remove(); - composition.RegisterUnique(); - composition.RegisterUnique(factory => Mock.Of()); + composition.Services.AddUnique(); + composition.Services.AddUnique(factory => Mock.Of()); // we don't want persisted nucache files in tests - composition.Register(factory => new PublishedSnapshotServiceOptions { IgnoreLocalDb = true }); + composition.Services.AddTransient(factory => new PublishedSnapshotServiceOptions { IgnoreLocalDb = true }); // ensure all lucene indexes are using RAM directory (no file system) - composition.RegisterUnique(); + composition.Services.AddUnique(); // replace this service so that it can lookup the correct file locations - composition.RegisterUnique(GetLocalizedTextService); + composition.Services.AddUnique(GetLocalizedTextService); - composition.RegisterUnique(); - composition.RegisterUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); } @@ -66,7 +67,7 @@ namespace Umbraco.Tests.Integration.Testing /// we don't need to copy files /// /// - private ILocalizedTextService GetLocalizedTextService(IFactory factory) + private ILocalizedTextService GetLocalizedTextService(IServiceProvider factory) { var globalSettings = factory.GetRequiredService>(); var loggerFactory = factory.GetRequiredService(); diff --git a/src/Umbraco.Tests.Integration/Testing/UmbracoIntegrationTest.cs b/src/Umbraco.Tests.Integration/Testing/UmbracoIntegrationTest.cs index d089c4a4e9..437a282ecf 100644 --- a/src/Umbraco.Tests.Integration/Testing/UmbracoIntegrationTest.cs +++ b/src/Umbraco.Tests.Integration/Testing/UmbracoIntegrationTest.cs @@ -34,7 +34,6 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Serilog; using Umbraco.Core.Logging.Serilog; -using Umbraco.Infrastructure.Composing; using ConnectionStrings = Umbraco.Core.Configuration.Models.ConnectionStrings; using ILogger = Microsoft.Extensions.Logging.ILogger; @@ -257,11 +256,9 @@ namespace Umbraco.Tests.Integration.Testing // Add it! services.AddUmbracoConfiguration(Configuration); - // TODO: MSDI - cleanup after initial merge. - var register = new ServiceCollectionRegistryAdapter(services); + services.AddUmbracoCore( webHostEnvironment, - register, GetType().Assembly, GetAppCaches(), TestHelper.GetLoggingConfiguration(), diff --git a/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentEventsTests.cs b/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentEventsTests.cs index 45b0eb0660..ce98e4f5a8 100644 --- a/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentEventsTests.cs +++ b/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentEventsTests.cs @@ -60,7 +60,7 @@ namespace Umbraco.Tests.Integration.Umbraco.Infrastructure.Services // base.Compose(); // // Composition.Register(_ => new TestServerRegistrar()); // localhost-only - // Composition.RegisterUnique(); + // composition.Services.AddUnique(); // // Composition.WithCollectionBuilder() // .Add() diff --git a/src/Umbraco.Tests.Integration/Umbraco.Web.BackOffice/Filters/ContentModelValidatorTests.cs b/src/Umbraco.Tests.Integration/Umbraco.Web.BackOffice/Filters/ContentModelValidatorTests.cs index f97a2db06d..629f9470ac 100644 --- a/src/Umbraco.Tests.Integration/Umbraco.Web.BackOffice/Filters/ContentModelValidatorTests.cs +++ b/src/Umbraco.Tests.Integration/Umbraco.Web.BackOffice/Filters/ContentModelValidatorTests.cs @@ -121,10 +121,10 @@ namespace Umbraco.Tests.Integration.Umbraco.Web.Backoffice.Filters // textService.Setup(x => x.Localize("validation/invalidNull", It.IsAny(), It.IsAny>())).Returns("invalidNull"); // textService.Setup(x => x.Localize("validation/invalidEmpty", It.IsAny(), It.IsAny>())).Returns("invalidEmpty"); // - // Composition.RegisterUnique(x => Mock.Of(x => x.GetDataType(It.IsAny()) == Mock.Of())); - // Composition.RegisterUnique(x => dataTypeService.Object); - // Composition.RegisterUnique(x => contentTypeService.Object); - // Composition.RegisterUnique(x => textService.Object); + // composition.Services.AddUnique(x => Mock.Of(x => x.GetDataType(It.IsAny()) == Mock.Of())); + // composition.Services.AddUnique(x => dataTypeService.Object); + // composition.Services.AddUnique(x => contentTypeService.Object); + // composition.Services.AddUnique(x => textService.Object); // // Composition.WithCollectionBuilder() // .Add() diff --git a/src/Umbraco.Tests.UnitTests/TestHelpers/BaseUsingSqlSyntax.cs b/src/Umbraco.Tests.UnitTests/TestHelpers/BaseUsingSqlSyntax.cs index aa041f7ac8..bf3f14004a 100644 --- a/src/Umbraco.Tests.UnitTests/TestHelpers/BaseUsingSqlSyntax.cs +++ b/src/Umbraco.Tests.UnitTests/TestHelpers/BaseUsingSqlSyntax.cs @@ -1,4 +1,5 @@ using System; +using Microsoft.Extensions.DependencyInjection; using Moq; using NPoco; using NUnit.Framework; @@ -36,9 +37,9 @@ namespace Umbraco.Tests.TestHelpers composition.WithCollectionBuilder() .AddCoreMappers(); - composition.RegisterUnique(_ => SqlContext); + composition.Services.AddUnique(_ => SqlContext); - var factory = composition.CreateFactory(); + var factory = composition.CreateServiceProvider(); var pocoMappers = new NPoco.MapperCollection { new PocoMapper() }; var pocoDataFactory = new FluentPocoDataFactory((type, iPocoDataFactory) => new PocoDataBuilder(type, pocoMappers).Init()); var sqlSyntax = new SqlServerSyntaxProvider(); diff --git a/src/Umbraco.Tests.UnitTests/TestHelpers/CompositionExtenions.cs b/src/Umbraco.Tests.UnitTests/TestHelpers/CompositionExtenions.cs deleted file mode 100644 index cdcc2a88dc..0000000000 --- a/src/Umbraco.Tests.UnitTests/TestHelpers/CompositionExtenions.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Microsoft.Extensions.DependencyInjection; -using Umbraco.Core.Composing; -using Umbraco.Infrastructure.Composing; - -namespace Umbraco.Tests.UnitTests.TestHelpers -{ - public static class CompositionExtenions - { - public static IFactory CreateFactory(this Composition composition) - { - composition.RegisterBuilders(); - return ServiceProviderFactoryAdapter.Wrap(composition.Services.BuildServiceProvider()); - } - } -} diff --git a/src/Umbraco.Tests.UnitTests/TestHelpers/CompositionExtensions.cs b/src/Umbraco.Tests.UnitTests/TestHelpers/CompositionExtensions.cs new file mode 100644 index 0000000000..6a4f228070 --- /dev/null +++ b/src/Umbraco.Tests.UnitTests/TestHelpers/CompositionExtensions.cs @@ -0,0 +1,16 @@ +using System; +using Microsoft.Extensions.DependencyInjection; +using Umbraco.Core.Composing; + +namespace Umbraco.Tests.UnitTests.TestHelpers +{ + public static class CompositionExtensions + { + [Obsolete("This extension method exists only to ease migration, please refactor")] + public static IServiceProvider CreateServiceProvider(this Composition composition) + { + composition.RegisterBuilders(); + return composition.Services.BuildServiceProvider(); + } + } +} diff --git a/src/Umbraco.Tests.UnitTests/TestHelpers/TestHelper.cs b/src/Umbraco.Tests.UnitTests/TestHelpers/TestHelper.cs index b3d893acd5..e7d6eec391 100644 --- a/src/Umbraco.Tests.UnitTests/TestHelpers/TestHelper.cs +++ b/src/Umbraco.Tests.UnitTests/TestHelpers/TestHelper.cs @@ -279,7 +279,7 @@ namespace Umbraco.Tests.TestHelpers public static IUmbracoVersion GetUmbracoVersion() => _testHelperInternal.GetUmbracoVersion(); - public static IServiceCollection GetServiceCollection() => new ServiceCollection(); + public static IServiceCollection GetServiceCollection() => new ServiceCollection().AddLazySupport(); public static IHostingEnvironment GetHostingEnvironment() => _testHelperInternal.GetHostingEnvironment(); diff --git a/src/Umbraco.Tests.UnitTests/Umbraco.Core/Components/ComponentTests.cs b/src/Umbraco.Tests.UnitTests/Umbraco.Core/Components/ComponentTests.cs index 1f6827784f..b96065b928 100644 --- a/src/Umbraco.Tests.UnitTests/Umbraco.Core/Components/ComponentTests.cs +++ b/src/Umbraco.Tests.UnitTests/Umbraco.Core/Components/ComponentTests.cs @@ -18,7 +18,6 @@ using Umbraco.Core.Logging; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.Mappers; using Umbraco.Core.Scoping; -using Umbraco.Infrastructure.Composing; using Umbraco.Tests.TestHelpers; namespace Umbraco.Tests.UnitTests.Umbraco.Core.Components @@ -31,11 +30,11 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Components private static readonly List Initialized = new List(); private static readonly List Terminated = new List(); - private static IFactory MockFactory(Action> setup = null) + private static IServiceProvider MockFactory(Action> setup = null) { // FIXME: use IUmbracoDatabaseFactory vs UmbracoDatabaseFactory, clean it all up! - var mock = new Mock(); + var mock = new Mock(); var loggerFactory = NullLoggerFactory.Instance; var logger = loggerFactory.CreateLogger("GenericLogger"); var typeFinder = TestHelper.GetTypeFinder(); @@ -47,11 +46,12 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Components var mediaFileSystem = Mock.Of(); var p = new ScopeProvider(f, fs, Options.Create(coreDebug), mediaFileSystem, loggerFactory.CreateLogger(), loggerFactory, typeFinder, NoAppCache.Instance); - mock.Setup(x => x.GetRequiredService(typeof (ILogger))).Returns(logger); - mock.Setup(x => x.GetRequiredService(typeof(ILoggerFactory))).Returns(loggerFactory); - mock.Setup(x => x.GetRequiredService(typeof (IProfilingLogger))).Returns(new ProfilingLogger(logger, Mock.Of())); - mock.Setup(x => x.GetRequiredService(typeof (IUmbracoDatabaseFactory))).Returns(f); - mock.Setup(x => x.GetRequiredService(typeof (IScopeProvider))).Returns(p); + mock.Setup(x => x.GetService(typeof (ILogger))).Returns(logger); + mock.Setup(x => x.GetService(typeof(ILogger))).Returns(loggerFactory.CreateLogger); + mock.Setup(x => x.GetService(typeof(ILoggerFactory))).Returns(loggerFactory); + mock.Setup(x => x.GetService(typeof (IProfilingLogger))).Returns(new ProfilingLogger(logger, Mock.Of())); + mock.Setup(x => x.GetService(typeof (IUmbracoDatabaseFactory))).Returns(f); + mock.Setup(x => x.GetService(typeof (IScopeProvider))).Returns(p); setup?.Invoke(mock); return mock.Object; @@ -89,7 +89,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Components var factory = MockFactory(m => { m.Setup(x => x.GetService(It.Is(t => t == typeof(ISomeResource)))).Returns(() => new SomeResource()); - m.Setup(x => x.GetRequiredService(It.IsAny())).Returns((type) => + m.Setup(x => x.GetService(It.IsAny())).Returns((type) => { if (type == typeof(Composer1)) return new Composer1(); if (type == typeof(Composer5)) return new Composer5(); @@ -101,7 +101,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Components }); var builder = composition.WithCollectionBuilder(); - builder.RegisterWith(ServiceCollectionRegistryAdapter.Wrap(register)); + builder.RegisterWith(register); var components = builder.CreateCollection(factory); Assert.IsEmpty(components); @@ -211,7 +211,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Components var factory = MockFactory(m => { m.Setup(x => x.GetService(It.Is(t => t == typeof (ISomeResource)))).Returns(() => new SomeResource()); - m.Setup(x => x.GetRequiredService(It.IsAny())).Returns((type) => + m.Setup(x => x.GetService(It.IsAny())).Returns((type) => { if (type == typeof(Composer1)) return new Composer1(); if (type == typeof(Composer5)) return new Composer5(); @@ -233,7 +233,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Components AssertTypeArray(TypeArray(), Composed); var builder = composition.WithCollectionBuilder(); - builder.RegisterWith(ServiceCollectionRegistryAdapter.Wrap(register)); + builder.RegisterWith(register); var components = builder.CreateCollection(factory); Assert.IsEmpty(Initialized); @@ -289,7 +289,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Components Composed.Clear(); composers.Compose(); var builder = composition.WithCollectionBuilder(); - builder.RegisterWith(ServiceCollectionRegistryAdapter.Wrap(register)); + builder.RegisterWith(register); var components = builder.CreateCollection(factory); Assert.AreEqual(3, Composed.Count); Assert.AreEqual(typeof(Composer4), Composed[0]); diff --git a/src/Umbraco.Tests.UnitTests/Umbraco.Core/Composing/CollectionBuildersTests.cs b/src/Umbraco.Tests.UnitTests/Umbraco.Core/Composing/CollectionBuildersTests.cs index 241ab5e6ec..cb8a88c3ec 100644 --- a/src/Umbraco.Tests.UnitTests/Umbraco.Core/Composing/CollectionBuildersTests.cs +++ b/src/Umbraco.Tests.UnitTests/Umbraco.Core/Composing/CollectionBuildersTests.cs @@ -8,7 +8,6 @@ using Umbraco.Core; using Umbraco.Core.Cache; using Umbraco.Core.Composing; using Umbraco.Core.Logging; -using Umbraco.Infrastructure.Composing; using Umbraco.Tests.TestHelpers; using Umbraco.Tests.UnitTests.TestHelpers; @@ -22,15 +21,6 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Composing [SetUp] public void Setup() { - // var registerMock = new Mock(); - // var factoryMock = new Mock(); - // registerMock.Setup(x => x.CreateFactory()).Returns(factoryMock.Object); - // factoryMock.Setup(x => x.GetInstance(typeof(Resolved1))).Returns(new Resolved1()); - // factoryMock.Setup(x => x.GetInstance(typeof(Resolved2))).Returns(new Resolved2()); - // factoryMock.Setup(x => x.GetInstance(typeof(Resolved3))).Returns(new Resolved3()); - // factoryMock.Setup(x => x.GetInstance(typeof(Resolved4))).Returns(new Resolved4()); - - var register = TestHelper.GetServiceCollection(); _composition = new Composition(register, TestHelper.GetMockedTypeLoader(), Mock.Of(), Mock.Of(), TestHelper.IOHelper, AppCaches.NoCache); } @@ -52,7 +42,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Composing Assert.IsFalse(builder.Has()); //Assert.IsFalse(col.ContainsType()); // does not compile - var factory = _composition.CreateFactory(); + var factory = _composition.CreateServiceProvider(); var col = builder.CreateCollection(factory); AssertCollection(col, typeof(Resolved1), typeof(Resolved2)); } @@ -68,7 +58,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Composing Assert.IsFalse(builder.Has()); Assert.IsFalse(builder.Has()); - var factory = _composition.CreateFactory(); + var factory = _composition.CreateServiceProvider(); var col = builder.CreateCollection(factory); AssertCollection(col); } @@ -80,7 +70,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Composing .Append() .Append(); - var factory = _composition.CreateFactory(); + var factory = _composition.CreateServiceProvider(); var col = builder.CreateCollection(factory); Assert.Throws(() => builder.Clear()); @@ -97,7 +87,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Composing Assert.IsTrue(builder.Has()); Assert.IsFalse(builder.Has()); - var factory = _composition.CreateFactory(); + var factory = _composition.CreateServiceProvider(); var col = builder.CreateCollection(factory); AssertCollection(col, typeof(Resolved1), typeof(Resolved2)); } @@ -107,7 +97,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Composing { var builder = _composition.WithCollectionBuilder(); - var factory = _composition.CreateFactory(); + var factory = _composition.CreateServiceProvider(); var col = builder.CreateCollection(factory); Assert.Throws(() => @@ -122,7 +112,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Composing builder.Append(); builder.Append(); - var factory = _composition.CreateFactory(); + var factory = _composition.CreateServiceProvider(); var col = builder.CreateCollection(factory); AssertCollection(col, typeof(Resolved1)); @@ -151,7 +141,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Composing Assert.IsFalse(builder.Has()); Assert.IsFalse(builder.Has()); - var factory = _composition.CreateFactory(); + var factory = _composition.CreateServiceProvider(); var col = builder.CreateCollection(factory); AssertCollection(col, typeof(Resolved1)); } @@ -164,7 +154,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Composing .Append() .Remove(); - var factory = _composition.CreateFactory(); + var factory = _composition.CreateServiceProvider(); var col = builder.CreateCollection(factory); AssertCollection(col, typeof(Resolved1), typeof(Resolved2)); } @@ -176,7 +166,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Composing .Append() .Append(); - var factory = _composition.CreateFactory(); + var factory = _composition.CreateServiceProvider(); var col = builder.CreateCollection(factory); Assert.Throws(() => builder.Remove() // throws @@ -195,7 +185,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Composing Assert.IsTrue(builder.Has()); Assert.IsTrue(builder.Has()); - var factory = _composition.CreateFactory(); + var factory = _composition.CreateServiceProvider(); var col = builder.CreateCollection(factory); AssertCollection(col, typeof(Resolved3), typeof(Resolved1), typeof(Resolved2)); } @@ -207,7 +197,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Composing .Append() .Append(); - var factory = _composition.CreateFactory(); + var factory = _composition.CreateServiceProvider(); var col = builder.CreateCollection(factory); Assert.Throws(() => builder.Insert() // throws @@ -222,7 +212,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Composing .Append() .Insert(); - var factory = _composition.CreateFactory(); + var factory = _composition.CreateServiceProvider(); var col = builder.CreateCollection(factory); AssertCollection(col, typeof(Resolved2), typeof(Resolved1)); } @@ -233,7 +223,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Composing var builder = _composition.WithCollectionBuilder(); builder.Insert(); - var factory = _composition.CreateFactory(); + var factory = _composition.CreateServiceProvider(); var col = builder.CreateCollection(factory); AssertCollection(col, typeof(Resolved2)); } @@ -266,7 +256,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Composing Assert.IsTrue(builder.Has()); Assert.IsTrue(builder.Has()); - var factory = _composition.CreateFactory(); + var factory = _composition.CreateServiceProvider(); var col = builder.CreateCollection(factory); AssertCollection(col, typeof(Resolved1), typeof(Resolved3), typeof(Resolved2)); } @@ -283,7 +273,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Composing Assert.IsTrue(builder.Has()); Assert.IsTrue(builder.Has()); - var factory = _composition.CreateFactory(); + var factory = _composition.CreateServiceProvider(); var col = builder.CreateCollection(factory); AssertCollection(col, typeof(Resolved1), typeof(Resolved3), typeof(Resolved2)); } @@ -300,7 +290,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Composing Assert.IsTrue(builder.Has()); Assert.IsTrue(builder.Has()); - var factory = _composition.CreateFactory(); + var factory = _composition.CreateServiceProvider(); var col = builder.CreateCollection(factory); AssertCollection(col, typeof(Resolved1), typeof(Resolved2), typeof(Resolved3)); } @@ -312,7 +302,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Composing .Append() .Append(); - var factory = _composition.CreateFactory(); + var factory = _composition.CreateServiceProvider(); var col = builder.CreateCollection(factory); Assert.Throws(() => builder.InsertBefore() @@ -327,7 +317,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Composing .Append() .InsertBefore(); - var factory = _composition.CreateFactory(); + var factory = _composition.CreateServiceProvider(); var col = builder.CreateCollection(factory); AssertCollection(col, typeof(Resolved2), typeof(Resolved1)); } @@ -354,17 +344,17 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Composing // but the container manages the scope, so to test the scope // the collection must come from the container - var factory = _composition.CreateFactory(); + var factory = _composition.CreateServiceProvider(); - using (factory.BeginScope()) + using (var scope = factory.CreateScope()) { - var col1 = factory.GetRequiredService(); + var col1 = scope.ServiceProvider.GetRequiredService(); AssertCollection(col1, typeof(Resolved1), typeof(Resolved2)); - var col2 = factory.GetRequiredService(); + var col2 = scope.ServiceProvider.GetRequiredService(); AssertCollection(col2, typeof(Resolved1), typeof(Resolved2)); - AssertSameCollection(factory, col1, col2); + AssertSameCollection(scope.ServiceProvider, col1, col2); } } @@ -380,7 +370,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Composing // but the container manages the scope, so to test the scope // the collection must come from the container - var factory = _composition.CreateFactory(); + var factory = _composition.CreateServiceProvider(); var col1 = factory.GetRequiredService(); AssertCollection(col1, typeof(Resolved1), typeof(Resolved2)); @@ -399,7 +389,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Composing .Insert() .InsertBefore(); - var factory = _composition.CreateFactory(); + var factory = _composition.CreateServiceProvider(); var col1 = builder.CreateCollection(factory); AssertCollection(col1, typeof(Resolved1), typeof(Resolved2), typeof(Resolved3)); } @@ -417,21 +407,21 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Composing TestCollection col1A, col1B; - var wrapper = (ServiceProviderFactoryAdapter)_composition.CreateFactory(); + var serviceProvider = _composition.CreateServiceProvider(); - using (var scope = wrapper.ServiceProvider.CreateScope()) + using (var scope = serviceProvider.CreateScope()) { col1A = scope.ServiceProvider.GetRequiredService(); col1B = scope.ServiceProvider.GetRequiredService(); AssertCollection(col1A, typeof(Resolved1), typeof(Resolved2)); AssertCollection(col1B, typeof(Resolved1), typeof(Resolved2)); - AssertSameCollection(wrapper, col1A, col1B); + AssertSameCollection(serviceProvider, col1A, col1B); } TestCollection col2; - using (var scope = wrapper.ServiceProvider.CreateScope()) + using (var scope = serviceProvider.CreateScope()) { col2 = scope.ServiceProvider.GetRequiredService(); } @@ -447,7 +437,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Composing .Add() .Add(); - var factory = _composition.CreateFactory(); + var factory = _composition.CreateServiceProvider(); var col = builder.CreateCollection(factory); AssertCollection(col, typeof(Resolved2), typeof(Resolved1)); } @@ -462,7 +452,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Composing Assert.IsInstanceOf(expected[i], colA[i]); } - private static void AssertSameCollection(IFactory factory, IEnumerable col1, IEnumerable col2) + private static void AssertSameCollection(IServiceProvider factory, IEnumerable col1, IEnumerable col2) { Assert.AreSame(col1, col2); @@ -531,7 +521,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Composing { protected override TestCollectionBuilderTransient This => this; - protected override Lifetime CollectionLifetime => Lifetime.Transient; // transient + protected override ServiceLifetime CollectionLifetime => ServiceLifetime.Transient; // transient } // ReSharper disable once ClassNeverInstantiated.Local @@ -539,7 +529,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Composing { protected override TestCollectionBuilderScope This => this; - protected override Lifetime CollectionLifetime => Lifetime.Scope; + protected override ServiceLifetime CollectionLifetime => ServiceLifetime.Scoped; } // ReSharper disable once ClassNeverInstantiated.Local diff --git a/src/Umbraco.Tests.UnitTests/Umbraco.Core/Composing/LazyCollectionBuilderTests.cs b/src/Umbraco.Tests.UnitTests/Umbraco.Core/Composing/LazyCollectionBuilderTests.cs index f73fcd83c0..e0a8c28518 100644 --- a/src/Umbraco.Tests.UnitTests/Umbraco.Core/Composing/LazyCollectionBuilderTests.cs +++ b/src/Umbraco.Tests.UnitTests/Umbraco.Core/Composing/LazyCollectionBuilderTests.cs @@ -37,7 +37,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Composing .Add() .Add(); - var factory = composition.CreateFactory(); + var factory = composition.CreateServiceProvider(); var values = factory.GetRequiredService(); @@ -62,7 +62,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Composing .Add(() => new[] { typeof(TransientObject3), typeof(TransientObject2) }) .Add(() => new[] { typeof(TransientObject1) }); - var factory = composition.CreateFactory(); + var factory = composition.CreateServiceProvider(); var values = factory.GetRequiredService(); @@ -88,7 +88,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Composing .Add() .Add(() => new[] { typeof(TransientObject1) }); - var factory = composition.CreateFactory(); + var factory = composition.CreateServiceProvider(); var values = factory.GetRequiredService(); @@ -120,7 +120,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Composing Assert.Throws(() => { // but throws here when trying to register the types, right before creating the factory - var factory = composition.CreateFactory(); + var factory = composition.CreateServiceProvider(); }); } @@ -135,7 +135,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Composing .Add(() => new[] { typeof(TransientObject3), typeof(TransientObject2), typeof(TransientObject1) }) .Exclude(); - var factory = composition.CreateFactory(); + var factory = composition.CreateServiceProvider(); var values = factory.GetRequiredService(); @@ -173,7 +173,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Composing { protected override TestCollectionBuilder This => this; - protected override Lifetime CollectionLifetime => Lifetime.Transient; // transient + protected override ServiceLifetime CollectionLifetime => ServiceLifetime.Transient; // transient } // ReSharper disable once ClassNeverInstantiated.Local diff --git a/src/Umbraco.Tests.UnitTests/Umbraco.Core/Composing/PackageActionCollectionTests.cs b/src/Umbraco.Tests.UnitTests/Umbraco.Core/Composing/PackageActionCollectionTests.cs index 5b2aae9fc2..b13da91a96 100644 --- a/src/Umbraco.Tests.UnitTests/Umbraco.Core/Composing/PackageActionCollectionTests.cs +++ b/src/Umbraco.Tests.UnitTests/Umbraco.Core/Composing/PackageActionCollectionTests.cs @@ -2,6 +2,7 @@ using System.Linq; using System.Xml; using System.Xml.Linq; +using Microsoft.Extensions.DependencyInjection; using Moq; using NUnit.Framework; using Umbraco.Core; @@ -28,7 +29,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Core.Composing composition.WithCollectionBuilder() .Add(() => expectedPackageActions); - var factory = composition.CreateFactory(); + var factory = composition.CreateServiceProvider(); var actions = factory.GetRequiredService(); Assert.AreEqual(2, actions.Count()); diff --git a/src/Umbraco.Tests/Cache/DistributedCacheBinderTests.cs b/src/Umbraco.Tests/Cache/DistributedCacheBinderTests.cs index 1632944895..3598c75cf7 100644 --- a/src/Umbraco.Tests/Cache/DistributedCacheBinderTests.cs +++ b/src/Umbraco.Tests/Cache/DistributedCacheBinderTests.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Threading; using Moq; using NUnit.Framework; +using Umbraco.Core; using Umbraco.Core.Cache; using Umbraco.Core.Composing; using Umbraco.Core.Events; @@ -30,7 +31,7 @@ namespace Umbraco.Tests.Cache base.Compose(composition); // refreshers.HandleEvents wants a UmbracoContext // which wants these - composition.RegisterUnique(_ => Mock.Of()); + composition.Services.AddUnique(_ => Mock.Of()); composition.WithCollectionBuilder(); } diff --git a/src/Umbraco.Tests/Cache/PublishedCache/PublishedContentCacheTests.cs b/src/Umbraco.Tests/Cache/PublishedCache/PublishedContentCacheTests.cs index 3ac7efd467..6f9a0a35a6 100644 --- a/src/Umbraco.Tests/Cache/PublishedCache/PublishedContentCacheTests.cs +++ b/src/Umbraco.Tests/Cache/PublishedCache/PublishedContentCacheTests.cs @@ -1,5 +1,6 @@ using System.Linq; using System.Xml; +using Microsoft.Extensions.DependencyInjection; using Moq; using NUnit.Framework; using Umbraco.Core; diff --git a/src/Umbraco.Tests/Cache/PublishedCache/PublishedMediaCacheTests.cs b/src/Umbraco.Tests/Cache/PublishedCache/PublishedMediaCacheTests.cs index 810532367a..cfcf7a82d8 100644 --- a/src/Umbraco.Tests/Cache/PublishedCache/PublishedMediaCacheTests.cs +++ b/src/Umbraco.Tests/Cache/PublishedCache/PublishedMediaCacheTests.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Xml; using Examine; +using Microsoft.Extensions.DependencyInjection; using NUnit.Framework; using Umbraco.Core; using Umbraco.Core.Cache; diff --git a/src/Umbraco.Tests/IO/FileSystemsTests.cs b/src/Umbraco.Tests/IO/FileSystemsTests.cs index 039ded5e4e..8623b015a4 100644 --- a/src/Umbraco.Tests/IO/FileSystemsTests.cs +++ b/src/Umbraco.Tests/IO/FileSystemsTests.cs @@ -15,7 +15,6 @@ using Umbraco.Core.IO; using Umbraco.Core.IO.MediaPathSchemes; using Umbraco.Core.Logging; using Umbraco.Core.Services; -using Umbraco.Infrastructure.Composing; using Umbraco.Tests.TestHelpers; using Umbraco.Web; using FileSystems = Umbraco.Core.IO.FileSystems; @@ -25,8 +24,8 @@ namespace Umbraco.Tests.IO [TestFixture] public class FileSystemsTests { - private IRegister _register; - private IFactory _factory; + private IServiceCollection _register; + private IServiceProvider _factory; [SetUp] public void Setup() @@ -34,7 +33,7 @@ namespace Umbraco.Tests.IO _register = TestHelper.GetRegister(); var composition = new Composition( - (_register as ServiceCollectionRegistryAdapter).Services, + _register, TestHelper.GetMockedTypeLoader(), Mock.Of(), Mock.Of(), @@ -42,22 +41,22 @@ namespace Umbraco.Tests.IO AppCaches.NoCache ); - composition.Register(_ => Mock.Of()); + composition.Services.AddTransient(_ => Mock.Of()); composition.Services.AddTransient(); - composition.Register(typeof(ILogger<>), typeof(Logger<>)); - composition.Register(_ => TestHelper.ShortStringHelper); - composition.Register(_ => TestHelper.IOHelper); - composition.RegisterUnique(); - composition.RegisterUnique(TestHelper.IOHelper); - composition.RegisterUnique(TestHelper.GetHostingEnvironment()); + composition.Services.AddTransient(typeof(ILogger<>), typeof(Logger<>)); + composition.Services.AddTransient(_ => TestHelper.ShortStringHelper); + composition.Services.AddTransient(_ => TestHelper.IOHelper); + composition.Services.AddUnique(); + composition.Services.AddUnique(TestHelper.IOHelper); + composition.Services.AddUnique(TestHelper.GetHostingEnvironment()); var globalSettings = new GlobalSettings(); - composition.Register(x => Microsoft.Extensions.Options.Options.Create(globalSettings)); + composition.Services.AddScoped(x => Microsoft.Extensions.Options.Options.Create(globalSettings)); composition.ComposeFileSystems(); - _factory = composition.CreateFactory(); + _factory = composition.CreateServiceProvider(); // make sure we start clean // because some tests will create corrupt or weird filesystems diff --git a/src/Umbraco.Tests/IO/ShadowFileSystemTests.cs b/src/Umbraco.Tests/IO/ShadowFileSystemTests.cs index 39052b7894..04900abaf0 100644 --- a/src/Umbraco.Tests/IO/ShadowFileSystemTests.cs +++ b/src/Umbraco.Tests/IO/ShadowFileSystemTests.cs @@ -402,7 +402,7 @@ namespace Umbraco.Tests.IO var phy = new PhysicalFileSystem(_ioHelper, _hostingEnvironment, _logger, path, "ignore"); - var container = Mock.Of(); + var container = Mock.Of(); var globalSettings = Options.Create(new GlobalSettings()); var fileSystems = new FileSystems(container, Mock.Of>(), loggerFactory, _ioHelper, globalSettings, _hostingEnvironment) { IsScoped = () => scopedFileSystems }; var fs = fileSystems.GetFileSystem(phy); @@ -495,7 +495,7 @@ namespace Umbraco.Tests.IO var phy = new PhysicalFileSystem(_ioHelper, _hostingEnvironment, _logger, path, "ignore"); - var container = Mock.Of(); + var container = Mock.Of(); var globalSettings = Options.Create(new GlobalSettings()); var fileSystems = new FileSystems(container, Mock.Of>(), NullLoggerFactory.Instance, _ioHelper, globalSettings, _hostingEnvironment) { IsScoped = () => scopedFileSystems }; var fs = fileSystems.GetFileSystem( phy); @@ -547,7 +547,7 @@ namespace Umbraco.Tests.IO var phy = new PhysicalFileSystem(_ioHelper, _hostingEnvironment, _logger, path, "ignore"); - var container = Mock.Of(); + var container = Mock.Of(); var globalSettings = Options.Create(new GlobalSettings()); var fileSystems = new FileSystems(container, Mock.Of>(), NullLoggerFactory.Instance, _ioHelper, globalSettings, _hostingEnvironment) { IsScoped = () => scopedFileSystems }; var fs = fileSystems.GetFileSystem( phy); diff --git a/src/Umbraco.Tests/Issues/U9560.cs b/src/Umbraco.Tests/Issues/U9560.cs index 279d6798aa..5ce89a583b 100644 --- a/src/Umbraco.Tests/Issues/U9560.cs +++ b/src/Umbraco.Tests/Issues/U9560.cs @@ -1,4 +1,5 @@ using System; +using Microsoft.Extensions.DependencyInjection; using NUnit.Framework; using Umbraco.Core.Models; using Umbraco.Core.Persistence; diff --git a/src/Umbraco.Tests/Models/ContentXmlTest.cs b/src/Umbraco.Tests/Models/ContentXmlTest.cs index 0aff0e7ad3..c512ac21c2 100644 --- a/src/Umbraco.Tests/Models/ContentXmlTest.cs +++ b/src/Umbraco.Tests/Models/ContentXmlTest.cs @@ -1,5 +1,6 @@ using System.Linq; using System.Xml.Linq; +using Microsoft.Extensions.DependencyInjection; using NUnit.Framework; using Umbraco.Core; using Umbraco.Core.Services; diff --git a/src/Umbraco.Tests/Models/MediaXmlTest.cs b/src/Umbraco.Tests/Models/MediaXmlTest.cs index 83184dcb82..92fd58d23c 100644 --- a/src/Umbraco.Tests/Models/MediaXmlTest.cs +++ b/src/Umbraco.Tests/Models/MediaXmlTest.cs @@ -1,5 +1,6 @@ using System.Linq; using System.Xml.Linq; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Moq; diff --git a/src/Umbraco.Tests/Packaging/PackageDataInstallationTests.cs b/src/Umbraco.Tests/Packaging/PackageDataInstallationTests.cs index 0576aa45d6..c94f9f5403 100644 --- a/src/Umbraco.Tests/Packaging/PackageDataInstallationTests.cs +++ b/src/Umbraco.Tests/Packaging/PackageDataInstallationTests.cs @@ -2,6 +2,7 @@ using System.Linq; using System.Threading; using System.Xml.Linq; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Moq; using NUnit.Framework; diff --git a/src/Umbraco.Tests/Packaging/PackageInstallationTest.cs b/src/Umbraco.Tests/Packaging/PackageInstallationTest.cs index d2b88fabff..e6816ba779 100644 --- a/src/Umbraco.Tests/Packaging/PackageInstallationTest.cs +++ b/src/Umbraco.Tests/Packaging/PackageInstallationTest.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Moq; diff --git a/src/Umbraco.Tests/Published/ConvertersTests.cs b/src/Umbraco.Tests/Published/ConvertersTests.cs index 1541f5d446..428011f243 100644 --- a/src/Umbraco.Tests/Published/ConvertersTests.cs +++ b/src/Umbraco.Tests/Published/ConvertersTests.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Moq; @@ -15,7 +16,6 @@ using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.PropertyEditors; using Umbraco.Core.Services; using Umbraco.Core.Strings; -using Umbraco.Infrastructure.Composing; using Umbraco.Tests.PublishedContent; using Umbraco.Tests.TestHelpers; using Umbraco.Web; @@ -35,7 +35,7 @@ namespace Umbraco.Tests.Published var register = TestHelper.GetRegister(); var composition = new Composition( - (register as ServiceCollectionRegistryAdapter).Services, + register, TestHelper.GetMockedTypeLoader(), Mock.Of(), Mock.Of(), @@ -52,7 +52,7 @@ namespace Umbraco.Tests.Published typeof (PublishedSnapshotTestObjects.TestElementModel1), typeof (PublishedSnapshotTestObjects.TestElementModel2), typeof (PublishedSnapshotTestObjects.TestContentModel1), typeof (PublishedSnapshotTestObjects.TestContentModel2), }, Mock.Of()); - register.Register(f => factory); + register.AddTransient(f => factory); @@ -63,9 +63,9 @@ namespace Umbraco.Tests.Published publishedSnapshotMock.Setup(x => x.Content).Returns(cacheMock.Object); var publishedSnapshotAccessorMock = new Mock(); publishedSnapshotAccessorMock.Setup(x => x.PublishedSnapshot).Returns(publishedSnapshotMock.Object); - register.Register(f => publishedSnapshotAccessorMock.Object); + register.AddTransient(f => publishedSnapshotAccessorMock.Object); - var registerFactory = composition.CreateFactory(); + var registerFactory = composition.CreateServiceProvider(); var converters = registerFactory.GetRequiredService(); var dataTypeServiceMock = new Mock(); diff --git a/src/Umbraco.Tests/PublishedContent/NuCacheChildrenTests.cs b/src/Umbraco.Tests/PublishedContent/NuCacheChildrenTests.cs index 9e36e867a4..55c56348a4 100644 --- a/src/Umbraco.Tests/PublishedContent/NuCacheChildrenTests.cs +++ b/src/Umbraco.Tests/PublishedContent/NuCacheChildrenTests.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Data; using System.Linq; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; @@ -54,14 +55,12 @@ namespace Umbraco.Tests.PublishedContent private void Init(Func> kits) { - Current.Reset(); - - var factory = Mock.Of(); + var factory = Mock.Of(); Current.Factory = factory; var hostingEnvironment = Mock.Of(); - Mock.Get(factory).Setup(x => x.GetRequiredService(typeof(IPublishedModelFactory))).Returns(PublishedModelFactory); + Mock.Get(factory).Setup(x => x.GetService(typeof(IPublishedModelFactory))).Returns(PublishedModelFactory); var runtime = Mock.Of(); Mock.Get(runtime).Setup(x => x.Level).Returns(RuntimeLevel.Run); @@ -172,7 +171,7 @@ namespace Umbraco.Tests.PublishedContent // invariant is the current default _variationAccesor.VariationContext = new VariationContext(); - Mock.Get(factory).Setup(x => x.GetRequiredService(typeof(IVariationContextAccessor))).Returns(_variationAccesor); + Mock.Get(factory).Setup(x => x.GetService(typeof(IVariationContextAccessor))).Returns(_variationAccesor); } private IEnumerable GetNestedVariantKits() diff --git a/src/Umbraco.Tests/PublishedContent/NuCacheTests.cs b/src/Umbraco.Tests/PublishedContent/NuCacheTests.cs index 4d5fcc6515..56f5804f12 100644 --- a/src/Umbraco.Tests/PublishedContent/NuCacheTests.cs +++ b/src/Umbraco.Tests/PublishedContent/NuCacheTests.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Data; using System.Linq; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Moq; @@ -47,13 +48,12 @@ namespace Umbraco.Tests.PublishedContent private void Init() { - Current.Reset(); - - var factory = Mock.Of(); + var factory = Mock.Of(); Current.Factory = factory; var publishedModelFactory = new NoopPublishedModelFactory(); - Mock.Get(factory).Setup(x => x.GetRequiredService(typeof(IPublishedModelFactory))).Returns(publishedModelFactory); + Mock.Get(factory).Setup(x => x.GetService(typeof(IPublishedModelFactory))).Returns(publishedModelFactory); + Mock.Get(factory).Setup(x => x.GetService(typeof(IPublishedValueFallback))).Returns(new NoopPublishedValueFallback()); // create a content node kit var kit = new ContentNodeKit @@ -212,7 +212,7 @@ namespace Umbraco.Tests.PublishedContent // invariant is the current default _variationAccesor.VariationContext = new VariationContext(); - Mock.Get(factory).Setup(x => x.GetRequiredService(typeof(IVariationContextAccessor))).Returns(_variationAccesor); + Mock.Get(factory).Setup(x => x.GetService(typeof(IVariationContextAccessor))).Returns(_variationAccesor); } [Test] diff --git a/src/Umbraco.Tests/PublishedContent/PublishedContentLanguageVariantTests.cs b/src/Umbraco.Tests/PublishedContent/PublishedContentLanguageVariantTests.cs index d02a49385d..547e7a637f 100644 --- a/src/Umbraco.Tests/PublishedContent/PublishedContentLanguageVariantTests.cs +++ b/src/Umbraco.Tests/PublishedContent/PublishedContentLanguageVariantTests.cs @@ -4,6 +4,7 @@ using System.Collections.ObjectModel; using System.Linq; using Moq; using NUnit.Framework; +using Umbraco.Core; using Umbraco.Core.Configuration.Models; using Umbraco.Core.Models; using Umbraco.Core.Models.PublishedContent; @@ -23,7 +24,7 @@ namespace Umbraco.Tests.PublishedContent { base.Compose(); - Composition.RegisterUnique(_ => GetServiceContext()); + Composition.Services.AddUnique(_ => GetServiceContext()); } protected ServiceContext GetServiceContext() diff --git a/src/Umbraco.Tests/PublishedContent/PublishedContentSnapshotTestBase.cs b/src/Umbraco.Tests/PublishedContent/PublishedContentSnapshotTestBase.cs index 2084a809b3..62fabf4a71 100644 --- a/src/Umbraco.Tests/PublishedContent/PublishedContentSnapshotTestBase.cs +++ b/src/Umbraco.Tests/PublishedContent/PublishedContentSnapshotTestBase.cs @@ -2,6 +2,7 @@ using System.IO; using System.Linq; using System.Web.Routing; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Moq; @@ -45,7 +46,7 @@ namespace Umbraco.Tests.PublishedContent { base.Compose(); - Composition.RegisterUnique(f => new PublishedModelFactory(f.GetRequiredService().GetTypes(), f.GetRequiredService())); + Composition.Services.AddUnique(f => new PublishedModelFactory(f.GetRequiredService().GetTypes(), f.GetRequiredService())); } protected override TypeLoader CreateTypeLoader(IIOHelper ioHelper, ITypeFinder typeFinder, IAppPolicyCache runtimeCache, ILogger logger, IProfilingLogger profilingLogger , IHostingEnvironment hostingEnvironment) @@ -86,13 +87,6 @@ namespace Umbraco.Tests.PublishedContent return umbracoContext; } - public override void TearDown() - { - base.TearDown(); - - Current.Reset(); - } - private SolidPublishedSnapshot CreatePublishedSnapshot() { var dataTypeService = new TestObjects.TestDataTypeService( diff --git a/src/Umbraco.Tests/PublishedContent/PublishedContentTestBase.cs b/src/Umbraco.Tests/PublishedContent/PublishedContentTestBase.cs index b8011d160d..c4bcd86e36 100644 --- a/src/Umbraco.Tests/PublishedContent/PublishedContentTestBase.cs +++ b/src/Umbraco.Tests/PublishedContent/PublishedContentTestBase.cs @@ -17,6 +17,7 @@ using Umbraco.Web.Templates; using Umbraco.Web.Routing; using Umbraco.Core.Media; using System; +using Microsoft.Extensions.DependencyInjection; namespace Umbraco.Tests.PublishedContent { diff --git a/src/Umbraco.Tests/PublishedContent/PublishedContentTests.cs b/src/Umbraco.Tests/PublishedContent/PublishedContentTests.cs index 5bf7120e02..50889bacd9 100644 --- a/src/Umbraco.Tests/PublishedContent/PublishedContentTests.cs +++ b/src/Umbraco.Tests/PublishedContent/PublishedContentTests.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using NUnit.Framework; @@ -42,11 +43,11 @@ namespace Umbraco.Tests.PublishedContent { base.Compose(); _publishedSnapshotAccessorMock = new Mock(); - Composition.RegisterUnique(_publishedSnapshotAccessorMock.Object); + Composition.Services.AddUnique(_publishedSnapshotAccessorMock.Object); - Composition.RegisterUnique(f => new PublishedModelFactory(f.GetRequiredService().GetTypes(), f.GetRequiredService())); - Composition.RegisterUnique(); - Composition.RegisterUnique(); + Composition.Services.AddUnique(f => new PublishedModelFactory(f.GetRequiredService().GetTypes(), f.GetRequiredService())); + Composition.Services.AddUnique(); + Composition.Services.AddUnique(); var loggerFactory = NullLoggerFactory.Instance; var mediaService = Mock.Of(); @@ -66,7 +67,7 @@ namespace Umbraco.Tests.PublishedContent new DataType(new IntegerPropertyEditor(loggerFactory, Mock.Of(), localizationService, ShortStringHelper, LocalizedTextService)) { Id = 1003 }, new DataType(new TextboxPropertyEditor(loggerFactory, Mock.Of(), localizationService, IOHelper, ShortStringHelper, LocalizedTextService)) { Id = 1004 }, new DataType(new MediaPickerPropertyEditor(loggerFactory, Mock.Of(), localizationService, IOHelper, ShortStringHelper, LocalizedTextService)) { Id = 1005 }); - Composition.RegisterUnique(f => dataTypeService); + Composition.Services.AddUnique(f => dataTypeService); } protected override void Initialize() diff --git a/src/Umbraco.Tests/PublishedContent/PublishedMediaTests.cs b/src/Umbraco.Tests/PublishedContent/PublishedMediaTests.cs index a8eaff34bf..c53cbea9e9 100644 --- a/src/Umbraco.Tests/PublishedContent/PublishedMediaTests.cs +++ b/src/Umbraco.Tests/PublishedContent/PublishedMediaTests.cs @@ -12,6 +12,7 @@ using System.Linq; using System.Threading; using System.Xml; using Examine; +using Microsoft.Extensions.DependencyInjection; using Umbraco.Core.Cache; using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.Strings; @@ -46,7 +47,7 @@ namespace Umbraco.Tests.PublishedContent .Clear() .Append(); - Composition.RegisterUnique(); + Composition.Services.AddUnique(); } private IMediaType MakeNewMediaType(IUser user, string text, int parentId = -1) diff --git a/src/Umbraco.Tests/Routing/BaseUrlProviderTest.cs b/src/Umbraco.Tests/Routing/BaseUrlProviderTest.cs index 8b05dd2c06..84e22c7760 100644 --- a/src/Umbraco.Tests/Routing/BaseUrlProviderTest.cs +++ b/src/Umbraco.Tests/Routing/BaseUrlProviderTest.cs @@ -28,8 +28,8 @@ namespace Umbraco.Tests.Routing var contentSettings = new ContentSettings(); var userPasswordConfigurationSettings = new UserPasswordConfigurationSettings(); - Composition.Register(x => Microsoft.Extensions.Options.Options.Create(contentSettings)); - Composition.Register(x => Microsoft.Extensions.Options.Options.Create(userPasswordConfigurationSettings)); + Composition.Services.AddTransient(x => Microsoft.Extensions.Options.Options.Create(contentSettings)); + Composition.Services.AddTransient(x => Microsoft.Extensions.Options.Options.Create(userPasswordConfigurationSettings)); } protected IPublishedUrlProvider GetPublishedUrlProvider(IUmbracoContext umbracoContext, DefaultUrlProvider urlProvider) diff --git a/src/Umbraco.Tests/Routing/ContentFinderByIdTests.cs b/src/Umbraco.Tests/Routing/ContentFinderByIdTests.cs index c02626bab4..deb5ac30bf 100644 --- a/src/Umbraco.Tests/Routing/ContentFinderByIdTests.cs +++ b/src/Umbraco.Tests/Routing/ContentFinderByIdTests.cs @@ -1,4 +1,5 @@ -using NUnit.Framework; +using Microsoft.Extensions.DependencyInjection; +using NUnit.Framework; using Microsoft.Extensions.Logging; using Umbraco.Core; using Umbraco.Core.Configuration.Models; diff --git a/src/Umbraco.Tests/Routing/RenderRouteHandlerTests.cs b/src/Umbraco.Tests/Routing/RenderRouteHandlerTests.cs index e926557856..19fccab900 100644 --- a/src/Umbraco.Tests/Routing/RenderRouteHandlerTests.cs +++ b/src/Umbraco.Tests/Routing/RenderRouteHandlerTests.cs @@ -2,6 +2,7 @@ using System.Linq; using System.Web.Mvc; using System.Web.Routing; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; @@ -69,13 +70,13 @@ namespace Umbraco.Tests.Routing Current.DefaultRenderMvcControllerType = typeof(RenderMvcController); // FIXME: Wrong! var surfaceControllerTypes = new SurfaceControllerTypeCollection(Composition.TypeLoader.GetSurfaceControllers()); - Composition.RegisterUnique(surfaceControllerTypes); + Composition.Services.AddUnique(surfaceControllerTypes); var umbracoApiControllerTypes = new UmbracoApiControllerTypeCollection(Composition.TypeLoader.GetUmbracoApiControllers()); - Composition.RegisterUnique(umbracoApiControllerTypes); + Composition.Services.AddUnique(umbracoApiControllerTypes); var requestHandlerSettings = new RequestHandlerSettings(); - Composition.RegisterUnique(_ => new DefaultShortStringHelper(Microsoft.Extensions.Options.Options.Create(requestHandlerSettings))); + Composition.Services.AddUnique(_ => new DefaultShortStringHelper(Microsoft.Extensions.Options.Options.Create(requestHandlerSettings))); } public override void TearDown() diff --git a/src/Umbraco.Tests/Routing/UrlProviderWithHideTopLevelNodeFromPathTests.cs b/src/Umbraco.Tests/Routing/UrlProviderWithHideTopLevelNodeFromPathTests.cs index 3ef99f203f..eba88383e7 100644 --- a/src/Umbraco.Tests/Routing/UrlProviderWithHideTopLevelNodeFromPathTests.cs +++ b/src/Umbraco.Tests/Routing/UrlProviderWithHideTopLevelNodeFromPathTests.cs @@ -1,5 +1,6 @@ using NUnit.Framework; using Microsoft.Extensions.Logging; +using Umbraco.Core; using Umbraco.Core.Configuration.Models; using Umbraco.Tests.Common; using Umbraco.Tests.Testing; @@ -27,7 +28,7 @@ namespace Umbraco.Tests.Routing protected override void ComposeSettings() { base.ComposeSettings(); - Composition.RegisterUnique(x => Microsoft.Extensions.Options.Options.Create(_globalSettings)); + Composition.Services.AddUnique(x => Microsoft.Extensions.Options.Options.Create(_globalSettings)); } [TestCase(1046, "/")] diff --git a/src/Umbraco.Tests/Routing/UrlProviderWithoutHideTopLevelNodeFromPathTests.cs b/src/Umbraco.Tests/Routing/UrlProviderWithoutHideTopLevelNodeFromPathTests.cs index 79a946f5e3..9e0d311188 100644 --- a/src/Umbraco.Tests/Routing/UrlProviderWithoutHideTopLevelNodeFromPathTests.cs +++ b/src/Umbraco.Tests/Routing/UrlProviderWithoutHideTopLevelNodeFromPathTests.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Globalization; using System.Linq; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Moq; using NUnit.Framework; @@ -33,7 +34,7 @@ namespace Umbraco.Tests.Routing protected override void ComposeSettings() { base.ComposeSettings(); - Composition.Register(x => Microsoft.Extensions.Options.Options.Create(_globalSettings)); + Composition.Services.AddTransient(x => Microsoft.Extensions.Options.Options.Create(_globalSettings)); } /// diff --git a/src/Umbraco.Tests/Routing/UrlRoutingTestBase.cs b/src/Umbraco.Tests/Routing/UrlRoutingTestBase.cs index 7566c5372d..346af19a4c 100644 --- a/src/Umbraco.Tests/Routing/UrlRoutingTestBase.cs +++ b/src/Umbraco.Tests/Routing/UrlRoutingTestBase.cs @@ -34,7 +34,7 @@ namespace Umbraco.Tests.Routing { base.Compose(); - Composition.RegisterUnique(_ => GetServiceContext()); + Composition.Services.AddUnique(_ => GetServiceContext()); } protected ServiceContext GetServiceContext() diff --git a/src/Umbraco.Tests/Routing/UrlsProviderWithDomainsTests.cs b/src/Umbraco.Tests/Routing/UrlsProviderWithDomainsTests.cs index 4165b381ca..5fef721dfa 100644 --- a/src/Umbraco.Tests/Routing/UrlsProviderWithDomainsTests.cs +++ b/src/Umbraco.Tests/Routing/UrlsProviderWithDomainsTests.cs @@ -25,7 +25,7 @@ namespace Umbraco.Tests.Routing { base.Compose(); - Composition.RegisterUnique(_ => Mock.Of()); + Composition.Services.AddUnique(_ => Mock.Of()); Composition.Services.AddTransient(); } diff --git a/src/Umbraco.Tests/Routing/UrlsWithNestedDomains.cs b/src/Umbraco.Tests/Routing/UrlsWithNestedDomains.cs index 4063568d47..f367db2123 100644 --- a/src/Umbraco.Tests/Routing/UrlsWithNestedDomains.cs +++ b/src/Umbraco.Tests/Routing/UrlsWithNestedDomains.cs @@ -27,7 +27,7 @@ namespace Umbraco.Tests.Routing protected override void Compose() { base.Compose(); - Composition.RegisterUnique(_ => Mock.Of()); + Composition.Services.AddUnique(_ => Mock.Of()); Composition.Services.AddTransient(); } diff --git a/src/Umbraco.Tests/Runtimes/CoreRuntimeTests.cs b/src/Umbraco.Tests/Runtimes/CoreRuntimeTests.cs index c624a720e9..60e395344d 100644 --- a/src/Umbraco.Tests/Runtimes/CoreRuntimeTests.cs +++ b/src/Umbraco.Tests/Runtimes/CoreRuntimeTests.cs @@ -18,7 +18,6 @@ using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Persistence; using Umbraco.Core.Runtime; -using Umbraco.Infrastructure.Composing; using Umbraco.Net; using Umbraco.Tests.TestHelpers; using Umbraco.Tests.TestHelpers.Stubs; @@ -37,7 +36,6 @@ namespace Umbraco.Tests.Runtimes public void SetUp() { TestComponent.Reset(); - Current.Reset(); } public void TearDown() @@ -91,10 +89,9 @@ namespace Umbraco.Tests.Runtimes public override void Configure(IServiceCollection services) { - var container = ServiceCollectionRegistryAdapter.Wrap(services); - container.Register(Lifetime.Singleton); - container.Register(Lifetime.Singleton); - container.Register(typeof(ILogger<>), typeof(Logger<>), Lifetime.Singleton); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(typeof(ILogger<>), typeof(Logger<>)); base.Configure(services); @@ -128,7 +125,7 @@ namespace Umbraco.Tests.Runtimes public void Compose(Composition composition) { - composition.RegisterUnique(); + composition.Services.AddUnique(); composition.Components().Append(); Composed = true; diff --git a/src/Umbraco.Tests/Scoping/ScopeEventDispatcherTests.cs b/src/Umbraco.Tests/Scoping/ScopeEventDispatcherTests.cs index e661aa0bfc..59f9a43526 100644 --- a/src/Umbraco.Tests/Scoping/ScopeEventDispatcherTests.cs +++ b/src/Umbraco.Tests/Scoping/ScopeEventDispatcherTests.cs @@ -15,11 +15,11 @@ using Umbraco.Core.Models; using Umbraco.Core.Persistence.Mappers; using Umbraco.Core.Scoping; using Umbraco.Core.Services; -using Umbraco.Infrastructure.Composing; using Umbraco.Tests.TestHelpers; using Umbraco.Tests.TestHelpers.Entities; using Umbraco.Web; using Current = Umbraco.Web.Composing.Current; +using Microsoft.Extensions.DependencyInjection; namespace Umbraco.Tests.Scoping { @@ -36,26 +36,19 @@ namespace Umbraco.Tests.Scoping DoThing2 = null; DoThing3 = null; - var wrapper = (ServiceCollectionRegistryAdapter) TestHelper.GetRegister(); + var services = TestHelper.GetRegister(); - var composition = new Composition(wrapper.Services, TestHelper.GetMockedTypeLoader(), Mock.Of(), Mock.Of(), TestHelper.IOHelper, AppCaches.NoCache); + var composition = new Composition(services, TestHelper.GetMockedTypeLoader(), Mock.Of(), Mock.Of(), TestHelper.IOHelper, AppCaches.NoCache); - _testObjects = new TestObjects(wrapper); + _testObjects = new TestObjects(services); var globalSettings = new GlobalSettings(); - composition.RegisterUnique(factory => new FileSystems(factory, factory.GetService>(), factory.GetService(), TestHelper.IOHelper, Microsoft.Extensions.Options.Options.Create(globalSettings), TestHelper.GetHostingEnvironment())); + composition.Services.AddUnique(factory => new FileSystems(factory, factory.GetService>(), factory.GetService(), TestHelper.IOHelper, Microsoft.Extensions.Options.Options.Create(globalSettings), TestHelper.GetHostingEnvironment())); composition.WithCollectionBuilder(); - Current.Reset(); - Current.Factory = composition.CreateFactory(); + Current.Factory = composition.CreateServiceProvider(); } - - [TearDown] - public void TearDown() - { - Current.Reset(); - } - + [TestCase(false, true, true)] [TestCase(false, true, false)] [TestCase(false, false, true)] diff --git a/src/Umbraco.Tests/Scoping/ScopedNuCacheTests.cs b/src/Umbraco.Tests/Scoping/ScopedNuCacheTests.cs index 1aa3594a96..9cb58c6536 100644 --- a/src/Umbraco.Tests/Scoping/ScopedNuCacheTests.cs +++ b/src/Umbraco.Tests/Scoping/ScopedNuCacheTests.cs @@ -1,5 +1,6 @@ using System; using System.Web.Routing; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Moq; @@ -42,8 +43,8 @@ namespace Umbraco.Tests.Scoping // but then, it requires a lot of plumbing ;( // FIXME: and we cannot inject a DistributedCache yet // so doing all this mess - Composition.RegisterUnique(); - Composition.RegisterUnique(f => Mock.Of()); + Composition.Services.AddUnique(); + Composition.Services.AddUnique(f => Mock.Of()); Composition.WithCollectionBuilder() .Add(() => Composition.TypeLoader.GetCacheRefreshers()); } diff --git a/src/Umbraco.Tests/Scoping/ScopedXmlTests.cs b/src/Umbraco.Tests/Scoping/ScopedXmlTests.cs index 9f2a05fdca..3a07a9864a 100644 --- a/src/Umbraco.Tests/Scoping/ScopedXmlTests.cs +++ b/src/Umbraco.Tests/Scoping/ScopedXmlTests.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Xml; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Moq; using NUnit.Framework; @@ -37,8 +38,8 @@ namespace Umbraco.Tests.Scoping // but then, it requires a lot of plumbing ;( // FIXME: and we cannot inject a DistributedCache yet // so doing all this mess - Composition.RegisterUnique(); - Composition.RegisterUnique(f => Mock.Of()); + Composition.Services.AddUnique(); + Composition.Services.AddUnique(f => Mock.Of()); Composition.WithCollectionBuilder() .Add(() => Composition.TypeLoader.GetCacheRefreshers()); } @@ -49,9 +50,9 @@ namespace Umbraco.Tests.Scoping var globalSettings = new GlobalSettings(); var userPasswordConfigurationSettings = new UserPasswordConfigurationSettings(); - Composition.Register(x => Microsoft.Extensions.Options.Options.Create(contentSettings)); - Composition.Register(x => Microsoft.Extensions.Options.Options.Create(globalSettings)); - Composition.Register(x => Microsoft.Extensions.Options.Options.Create(userPasswordConfigurationSettings)); + Composition.Services.AddTransient(x => Microsoft.Extensions.Options.Options.Create(contentSettings)); + Composition.Services.AddTransient(x => Microsoft.Extensions.Options.Options.Create(globalSettings)); + Composition.Services.AddTransient(x => Microsoft.Extensions.Options.Options.Create(userPasswordConfigurationSettings)); } [TearDown] diff --git a/src/Umbraco.Tests/TestHelpers/BaseUsingSqlCeSyntax.cs b/src/Umbraco.Tests/TestHelpers/BaseUsingSqlCeSyntax.cs index 02484f2f0a..ddfc6fa7f1 100644 --- a/src/Umbraco.Tests/TestHelpers/BaseUsingSqlCeSyntax.cs +++ b/src/Umbraco.Tests/TestHelpers/BaseUsingSqlCeSyntax.cs @@ -1,5 +1,6 @@ using System; using System.IO; +using Microsoft.Extensions.DependencyInjection; using Moq; using NPoco; using NUnit.Framework; @@ -11,7 +12,6 @@ using Umbraco.Core.Composing; using Umbraco.Core.Logging; using Umbraco.Core.Persistence.Mappers; using Umbraco.Core.Persistence; -using Umbraco.Infrastructure.Composing; using Umbraco.Persistance.SqlCe; using Umbraco.Web; using Current = Umbraco.Web.Composing.Current; @@ -35,9 +35,7 @@ namespace Umbraco.Tests.TestHelpers [SetUp] public virtual void Initialize() { - Current.Reset(); - - var wrapper = (ServiceCollectionRegistryAdapter) TestHelper.GetRegister(); + var services = TestHelper.GetRegister(); var ioHelper = TestHelper.IOHelper; var logger = new ProfilingLogger(Mock.Of(), Mock.Of()); @@ -48,20 +46,19 @@ namespace Umbraco.Tests.TestHelpers logger, false); - var composition = new Composition(wrapper.Services, typeLoader, Mock.Of(), Mock.Of(), TestHelper.IOHelper, AppCaches.NoCache); + var composition = new Composition(services, typeLoader, Mock.Of(), Mock.Of(), TestHelper.IOHelper, AppCaches.NoCache); - composition.RegisterUnique(_ => Mock.Of()); - composition.RegisterUnique(_ => NullLoggerFactory.Instance); - composition.RegisterUnique(_ => Mock.Of()); - - composition.RegisterUnique(typeLoader); + services.AddUnique(_ => Mock.Of()); + services.AddUnique(_ => NullLoggerFactory.Instance); + services.AddUnique(_ => Mock.Of()); + services.AddUnique(typeLoader); composition.WithCollectionBuilder() .AddCoreMappers(); - composition.RegisterUnique(_ => SqlContext); + services.AddUnique(_ => SqlContext); - var factory = Current.Factory = composition.CreateFactory(); + var factory = Current.Factory = composition.CreateServiceProvider(); var pocoMappers = new NPoco.MapperCollection { new PocoMapper() }; var pocoDataFactory = new FluentPocoDataFactory((type, iPocoDataFactory) => new PocoDataBuilder(type, pocoMappers).Init()); @@ -74,12 +71,5 @@ namespace Umbraco.Tests.TestHelpers public virtual void SetUp() {} - - [TearDown] - public virtual void TearDown() - { - //MappingResolver.Reset(); - Current.Reset(); - } } } diff --git a/src/Umbraco.Tests/TestHelpers/BaseWebTest.cs b/src/Umbraco.Tests/TestHelpers/BaseWebTest.cs index 4a59229980..e9455a22d5 100644 --- a/src/Umbraco.Tests/TestHelpers/BaseWebTest.cs +++ b/src/Umbraco.Tests/TestHelpers/BaseWebTest.cs @@ -1,6 +1,7 @@ using System; using System.Linq; using System.Threading; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Moq; @@ -35,8 +36,8 @@ namespace Umbraco.Tests.TestHelpers { base.Compose(); - Composition.RegisterUnique(); - Composition.RegisterUnique(); + Composition.Services.AddUnique(); + Composition.Services.AddUnique(); } protected override void Initialize() @@ -93,13 +94,13 @@ namespace Umbraco.Tests.TestHelpers "; } - internal PublishedRouter CreatePublishedRouter(IFactory container = null, ContentFinderCollection contentFinders = null) + internal PublishedRouter CreatePublishedRouter(IServiceProvider container = null, ContentFinderCollection contentFinders = null) { var webRoutingSettings = new WebRoutingSettings(); return CreatePublishedRouter(webRoutingSettings, container ?? Factory, contentFinders); } - internal static PublishedRouter CreatePublishedRouter(WebRoutingSettings webRoutingSettings, IFactory container = null, ContentFinderCollection contentFinders = null) + internal static PublishedRouter CreatePublishedRouter(WebRoutingSettings webRoutingSettings, IServiceProvider container = null, ContentFinderCollection contentFinders = null) { return new PublishedRouter( Microsoft.Extensions.Options.Options.Create(webRoutingSettings), diff --git a/src/Umbraco.Tests/TestHelpers/Stubs/TestControllerFactory.cs b/src/Umbraco.Tests/TestHelpers/Stubs/TestControllerFactory.cs index af4114672b..a718a09d5b 100644 --- a/src/Umbraco.Tests/TestHelpers/Stubs/TestControllerFactory.cs +++ b/src/Umbraco.Tests/TestHelpers/Stubs/TestControllerFactory.cs @@ -5,6 +5,7 @@ using System.Reflection; using System.Web.Mvc; using System.Web.Routing; using System.Web.SessionState; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Moq; using Umbraco.Core; diff --git a/src/Umbraco.Tests/TestHelpers/TestHelper.cs b/src/Umbraco.Tests/TestHelpers/TestHelper.cs index b016b4ebe6..e91c2fdf4d 100644 --- a/src/Umbraco.Tests/TestHelpers/TestHelper.cs +++ b/src/Umbraco.Tests/TestHelpers/TestHelper.cs @@ -7,6 +7,7 @@ using System.Linq; using System.Reflection; using System.Threading; using System.Web; +using Microsoft.Extensions.DependencyInjection; using Moq; using NUnit.Framework; using Umbraco.Core; @@ -306,7 +307,7 @@ namespace Umbraco.Tests.TestHelpers public static IUmbracoVersion GetUmbracoVersion() => _testHelperInternal.GetUmbracoVersion(); - public static IRegister GetRegister() => _testHelperInternal.GetRegister(); + public static IServiceCollection GetRegister() => _testHelperInternal.GetRegister().AddLazySupport(); public static IHostingEnvironment GetHostingEnvironment() => _testHelperInternal.GetHostingEnvironment(); diff --git a/src/Umbraco.Tests/TestHelpers/TestObjects-Mocks.cs b/src/Umbraco.Tests/TestHelpers/TestObjects-Mocks.cs index 70768e89f0..d6ace1ac2c 100644 --- a/src/Umbraco.Tests/TestHelpers/TestObjects-Mocks.cs +++ b/src/Umbraco.Tests/TestHelpers/TestObjects-Mocks.cs @@ -17,6 +17,7 @@ using Umbraco.Persistance.SqlCe; using Umbraco.Tests.Common; using Umbraco.Web; using Umbraco.Web.PublishedCache; +using Microsoft.Extensions.DependencyInjection; namespace Umbraco.Tests.TestHelpers { @@ -54,7 +55,7 @@ namespace Umbraco.Tests.TestHelpers /// Gets a mocked service context built with mocked services. /// /// A ServiceContext. - public ServiceContext GetServiceContextMock(IFactory container = null) + public ServiceContext GetServiceContextMock(IServiceProvider container = null) { // FIXME: else some tests break - figure it out container = null; @@ -82,7 +83,7 @@ namespace Umbraco.Tests.TestHelpers MockService(container)); } - private T MockService(IFactory container = null) + private T MockService(IServiceProvider container = null) where T : class { return container?.GetService() ?? new Mock().Object; diff --git a/src/Umbraco.Tests/TestHelpers/TestObjects.cs b/src/Umbraco.Tests/TestHelpers/TestObjects.cs index ccca89f096..91b82caccb 100644 --- a/src/Umbraco.Tests/TestHelpers/TestObjects.cs +++ b/src/Umbraco.Tests/TestHelpers/TestObjects.cs @@ -2,6 +2,7 @@ using System.Configuration; using System.IO; using System.Linq; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Microsoft.Extensions.Logging; using Moq; @@ -31,9 +32,9 @@ namespace Umbraco.Tests.TestHelpers /// internal partial class TestObjects { - private readonly IRegister _register; + private readonly IServiceCollection _register; - public TestObjects(IRegister register) + public TestObjects(IServiceCollection register) { _register = register; } @@ -68,13 +69,13 @@ namespace Umbraco.Tests.TestHelpers return new UmbracoDatabase(connection, sqlContext, logger, TestHelper.BulkSqlInsertProvider); } - private Lazy GetLazyService(IFactory container, Func ctor) + private Lazy GetLazyService(IServiceProvider container, Func ctor) where T : class { return new Lazy(() => container?.GetService() ?? ctor(container)); } - private T GetRepo(IFactory container) + private T GetRepo(IServiceProvider container) where T : class, IRepository { return container?.GetService() ?? Mock.Of(); diff --git a/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs b/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs index d6ff5fcfbb..270b391094 100644 --- a/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs +++ b/src/Umbraco.Tests/TestHelpers/TestWithDatabaseBase.cs @@ -76,8 +76,8 @@ namespace Umbraco.Tests.TestHelpers base.Compose(); Composition.Services.AddTransient(); - Composition.Register(factory => PublishedSnapshotService); - Composition.Register(factory => DefaultCultureAccessor); + Composition.Services.AddTransient(factory => PublishedSnapshotService); + Composition.Services.AddTransient(factory => DefaultCultureAccessor); Composition.WithCollectionBuilder() .Clear() @@ -86,7 +86,7 @@ namespace Umbraco.Tests.TestHelpers Composition.WithCollectionBuilder() .Add(Composition.TypeLoader.GetUmbracoApiControllers()); - Composition.RegisterUnique(f => + Composition.Services.AddUnique(f => { if (Options.Database == UmbracoTestOptions.Database.None) return TestObjects.GetDatabaseFactoryMock(); diff --git a/src/Umbraco.Tests/Testing/TestingTests/MockTests.cs b/src/Umbraco.Tests/Testing/TestingTests/MockTests.cs index 735811d355..9c259d7d16 100644 --- a/src/Umbraco.Tests/Testing/TestingTests/MockTests.cs +++ b/src/Umbraco.Tests/Testing/TestingTests/MockTests.cs @@ -63,10 +63,10 @@ namespace Umbraco.Tests.Testing.TestingTests public void Can_Mock_Umbraco_Helper() { // unless we can inject them in MembershipHelper, we need need this - Composition.Register(_ => Mock.Of()); - Composition.Register(_ => Mock.Of()); - Composition.Register(_ => Mock.Of()); - Composition.Register(_ => AppCaches.Disabled); + Composition.Services.AddTransient(_ => Mock.Of()); + Composition.Services.AddTransient(_ => Mock.Of()); + Composition.Services.AddTransient(_ => Mock.Of()); + Composition.Services.AddTransient(_ => AppCaches.Disabled); Composition.Services.AddTransient(); // ReSharper disable once UnusedVariable diff --git a/src/Umbraco.Tests/Testing/UmbracoTestBase.cs b/src/Umbraco.Tests/Testing/UmbracoTestBase.cs index 5e15a58017..e009afacac 100644 --- a/src/Umbraco.Tests/Testing/UmbracoTestBase.cs +++ b/src/Umbraco.Tests/Testing/UmbracoTestBase.cs @@ -43,7 +43,6 @@ using Umbraco.Core.Serialization; using Umbraco.Core.Services; using Umbraco.Core.Services.Implement; using Umbraco.Core.Strings; -using Umbraco.Infrastructure.Composing; using Umbraco.Net; using Umbraco.Tests.Common; using Umbraco.Tests.TestHelpers; @@ -106,7 +105,7 @@ namespace Umbraco.Tests.Testing protected Composition Composition { get; private set; } - protected IFactory Factory { get; private set; } + protected IServiceProvider Factory { get; private set; } protected UmbracoTestAttribute Options { get; private set; } @@ -203,11 +202,11 @@ namespace Umbraco.Tests.Testing LocalizedTextService = new LocalizedTextService(new Dictionary>(), loggerFactory.CreateLogger()); var typeLoader = GetTypeLoader(IOHelper, TypeFinder, appCaches.RuntimeCache, HostingEnvironment, loggerFactory.CreateLogger(), proflogger, Options.TypeLoader); - var register = TestHelper.GetRegister(); + var services = TestHelper.GetRegister(); Composition = new Composition( - (register as ServiceCollectionRegistryAdapter).Services, + services, typeLoader, proflogger, MockRuntimeState(RuntimeLevel.Run), @@ -216,25 +215,25 @@ namespace Umbraco.Tests.Testing ); //TestHelper.GetConfigs().RegisterWith(register); - Composition.RegisterUnique(typeof(ILoggerFactory), loggerFactory); - Composition.Register(typeof(ILogger<>), typeof(Logger<>)); - Composition.Register(typeof(ILogger), msLogger); - Composition.RegisterUnique(IOHelper); - Composition.RegisterUnique(UriUtility); - Composition.RegisterUnique(UmbracoVersion); - Composition.RegisterUnique(TypeFinder); - Composition.RegisterUnique(LocalizedTextService); - Composition.RegisterUnique(typeLoader); - Composition.RegisterUnique(profiler); - Composition.RegisterUnique(proflogger); - Composition.RegisterUnique(appCaches); - Composition.RegisterUnique(HostingEnvironment); - Composition.RegisterUnique(backOfficeInfo); - Composition.RegisterUnique(ipResolver); - Composition.RegisterUnique(); - Composition.RegisterUnique(TestHelper.ShortStringHelper); - Composition.RegisterUnique(); - Composition.RegisterUnique(); + services.AddUnique(typeof(ILoggerFactory), loggerFactory); + services.AddTransient(typeof(ILogger<>), typeof(Logger<>)); + services.AddSingleton(msLogger); + services.AddUnique(IOHelper); + services.AddUnique(UriUtility); + services.AddUnique(UmbracoVersion); + services.AddUnique(TypeFinder); + services.AddUnique(LocalizedTextService); + services.AddUnique(typeLoader); + services.AddUnique(profiler); + services.AddUnique(proflogger); + services.AddUnique(appCaches); + services.AddUnique(HostingEnvironment); + services.AddUnique(backOfficeInfo); + services.AddUnique(ipResolver); + services.AddUnique(); + services.AddUnique(TestHelper.ShortStringHelper); + services.AddUnique(); + services.AddUnique(); var memberService = Mock.Of(); @@ -242,14 +241,14 @@ namespace Umbraco.Tests.Testing var membershipProvider = new MembersMembershipProvider(memberService, memberTypeService, Mock.Of(), TestHelper.GetHostingEnvironment(), TestHelper.GetIpResolver()); var membershipHelper = new MembershipHelper(Mock.Of(), Mock.Of(), membershipProvider, Mock.Of(), memberService, memberTypeService, Mock.Of(), AppCaches.Disabled, loggerFactory, ShortStringHelper, Mock.Of()); - Composition.RegisterUnique(membershipHelper); + services.AddUnique(membershipHelper); - TestObjects = new TestObjects(register); + TestObjects = new TestObjects(services); Compose(); - Current.Factory = Factory = Composition.CreateFactory(); + Current.Factory = Factory = Composition.CreateServiceProvider(); Initialize(); } @@ -313,17 +312,17 @@ namespace Umbraco.Tests.Testing Umbraco.Web.Composing.Current.UmbracoContextAccessor = new TestUmbracoContextAccessor(); // web - Composition.RegisterUnique(_ => Umbraco.Web.Composing.Current.UmbracoContextAccessor); - Composition.RegisterUnique(); + Composition.Services.AddUnique(_ => Umbraco.Web.Composing.Current.UmbracoContextAccessor); + Composition.Services.AddUnique(); Composition.WithCollectionBuilder(); Composition.DataValueReferenceFactories(); - Composition.RegisterUnique(); - Composition.RegisterUnique(); - Composition.RegisterUnique(); + Composition.Services.AddUnique(); + Composition.Services.AddUnique(); + Composition.Services.AddUnique(); Composition.SetCultureDictionaryFactory(); - Composition.Register(f => f.GetRequiredService().CreateDictionary(), Lifetime.Singleton); + Composition.Services.AddSingleton(f => f.GetRequiredService().CreateDictionary()); // register back office sections in the order we want them rendered Composition.WithCollectionBuilder().Append() .Append() @@ -333,18 +332,18 @@ namespace Umbraco.Tests.Testing .Append() .Append() .Append(); - Composition.RegisterUnique(); + Composition.Services.AddUnique(); - Composition.RegisterUnique(); - Composition.RegisterUnique(); - Composition.RegisterUnique(); - Composition.RegisterUnique(); - Composition.RegisterUnique(); - Composition.RegisterUnique(); - Composition.RegisterUnique(); + Composition.Services.AddUnique(); + Composition.Services.AddUnique(); + Composition.Services.AddUnique(); + Composition.Services.AddUnique(); + Composition.Services.AddUnique(); + Composition.Services.AddUnique(); + Composition.Services.AddUnique(); var webRoutingSettings = new WebRoutingSettings(); - Composition.RegisterUnique(factory => + Composition.Services.AddUnique(factory => new UrlProvider( factory.GetRequiredService(), Microsoft.Extensions.Options.Options.Create(webRoutingSettings), @@ -361,17 +360,17 @@ namespace Umbraco.Tests.Testing // what else? var runtimeStateMock = new Mock(); runtimeStateMock.Setup(x => x.Level).Returns(RuntimeLevel.Run); - Composition.RegisterUnique(f => runtimeStateMock.Object); - Composition.Register(_ => Mock.Of()); + Composition.Services.AddUnique(f => runtimeStateMock.Object); + Composition.Services.AddTransient(_ => Mock.Of()); Composition.Services.AddTransient(); // ah... Composition.WithCollectionBuilder(); Composition.WithCollectionBuilder(); - Composition.RegisterUnique(); - Composition.RegisterUnique(); + Composition.Services.AddUnique(); + Composition.Services.AddUnique(); - Composition.RegisterUnique(); + Composition.Services.AddUnique(); // register empty content apps collection Composition.WithCollectionBuilder(); @@ -443,13 +442,13 @@ namespace Umbraco.Tests.Testing var userPasswordConfigurationSettings = new UserPasswordConfigurationSettings(); var webRoutingSettings = new WebRoutingSettings(); - Composition.Register(x => Microsoft.Extensions.Options.Options.Create(contentSettings)); - Composition.Register(x => Microsoft.Extensions.Options.Options.Create(coreDebugSettings)); - Composition.Register(x => Microsoft.Extensions.Options.Options.Create(globalSettings)); - Composition.Register(x => Microsoft.Extensions.Options.Options.Create(nuCacheSettings)); - Composition.Register(x => Microsoft.Extensions.Options.Options.Create(requestHandlerSettings)); - Composition.Register(x => Microsoft.Extensions.Options.Options.Create(userPasswordConfigurationSettings)); - Composition.Register(x => Microsoft.Extensions.Options.Options.Create(webRoutingSettings)); + Composition.Services.AddTransient(x => Microsoft.Extensions.Options.Options.Create(contentSettings)); + Composition.Services.AddTransient(x => Microsoft.Extensions.Options.Options.Create(coreDebugSettings)); + Composition.Services.AddTransient(x => Microsoft.Extensions.Options.Options.Create(globalSettings)); + Composition.Services.AddTransient(x => Microsoft.Extensions.Options.Options.Create(nuCacheSettings)); + Composition.Services.AddTransient(x => Microsoft.Extensions.Options.Options.Create(requestHandlerSettings)); + Composition.Services.AddTransient(x => Microsoft.Extensions.Options.Options.Create(userPasswordConfigurationSettings)); + Composition.Services.AddTransient(x => Microsoft.Extensions.Options.Options.Create(webRoutingSettings)); } protected virtual void ComposeApplication(bool withApplication) @@ -461,66 +460,66 @@ namespace Umbraco.Tests.Testing // default Datalayer/Repositories/SQL/Database/etc... Composition.ComposeRepositories(); - Composition.RegisterUnique(); + Composition.Services.AddUnique(); - Composition.RegisterUnique(); - Composition.RegisterUnique(); - Composition.RegisterUnique(); + Composition.Services.AddUnique(); + Composition.Services.AddUnique(); + Composition.Services.AddUnique(); // register filesystems - Composition.RegisterUnique(factory => TestObjects.GetFileSystemsMock()); + Composition.Services.AddUnique(factory => TestObjects.GetFileSystemsMock()); var scheme = Mock.Of(); var mediaFileSystem = new MediaFileSystem(Mock.Of(), scheme, _loggerFactory.CreateLogger(), TestHelper.ShortStringHelper); - Composition.RegisterUnique(factory => mediaFileSystem); + Composition.Services.AddUnique(factory => mediaFileSystem); // no factory (noop) - Composition.RegisterUnique(); + Composition.Services.AddUnique(); // register application stuff (database factory & context, services...) Composition.WithCollectionBuilder() .AddCoreMappers(); - Composition.RegisterUnique(_ => new TransientEventMessagesFactory()); + Composition.Services.AddUnique(_ => new TransientEventMessagesFactory()); var globalSettings = new GlobalSettings(); var connectionStrings = new ConnectionStrings(); - Composition.RegisterUnique(f => new UmbracoDatabaseFactory(_loggerFactory.CreateLogger(), + Composition.Services.AddUnique(f => new UmbracoDatabaseFactory(_loggerFactory.CreateLogger(), LoggerFactory, globalSettings, connectionStrings, new Lazy(f.GetRequiredService), TestHelper.DbProviderFactoryCreator)); - Composition.RegisterUnique(f => f.GetService().SqlContext); + Composition.Services.AddUnique(f => f.GetService().SqlContext); Composition.WithCollectionBuilder(); // empty - Composition.RegisterUnique(factory + Composition.Services.AddUnique(factory => TestObjects.GetScopeProvider(_loggerFactory, factory.GetService(), factory.GetService(), factory.GetService())); - Composition.RegisterUnique(factory => (IScopeAccessor) factory.GetRequiredService()); + Composition.Services.AddUnique(factory => (IScopeAccessor) factory.GetRequiredService()); Composition.ComposeServices(); // composition root is doing weird things, fix - Composition.RegisterUnique(); - Composition.RegisterUnique(); + Composition.Services.AddUnique(); + Composition.Services.AddUnique(); // somehow property editor ends up wanting this Composition.WithCollectionBuilder(); - Composition.RegisterUnique(); + Composition.Services.AddUnique(); // note - don't register collections, use builders Composition.WithCollectionBuilder(); - Composition.RegisterUnique(); - Composition.RegisterUnique(); + Composition.Services.AddUnique(); + Composition.Services.AddUnique(); - Composition.RegisterUnique(TestHelper.GetHttpContextAccessor(GetHttpContextFactory("/").HttpContext)); + Composition.Services.AddUnique(TestHelper.GetHttpContextAccessor(GetHttpContextFactory("/").HttpContext)); } #endregion @@ -564,20 +563,26 @@ namespace Umbraco.Tests.Testing protected virtual void Reset() { - // reset and dispose scopes - // ensures we don't leak an opened database connection - // which would lock eg SqlCe .sdf files - if (Factory?.GetService() is ScopeProvider scopeProvider) + try { - Scope scope; - while ((scope = scopeProvider.AmbientScope) != null) + // reset and dispose scopes + // ensures we don't leak an opened database connection + // which would lock eg SqlCe .sdf files + if (Factory?.GetService() is ScopeProvider scopeProvider) { - scope.Reset(); - scope.Dispose(); + Scope scope; + while ((scope = scopeProvider.AmbientScope) != null) + { + scope.Reset(); + scope.Dispose(); + } } } - - Current.Reset(); // disposes the factory + catch (ObjectDisposedException ex) + { + if (!ex.ObjectName.Equals(nameof(IServiceProvider))) + throw; + } // reset all other static things that should not be static ;( UriUtility.ResetAppDomainAppVirtualPath(HostingEnvironment); diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj index 8ef268d214..13e9cbeef1 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -88,8 +88,6 @@ 1.11.24 - - @@ -99,6 +97,9 @@ + + 3.1.8 + @@ -210,7 +211,6 @@ - diff --git a/src/Umbraco.Tests/UmbracoExamine/EventsTest.cs b/src/Umbraco.Tests/UmbracoExamine/EventsTest.cs index 6eb4a17dcf..f40cae536f 100644 --- a/src/Umbraco.Tests/UmbracoExamine/EventsTest.cs +++ b/src/Umbraco.Tests/UmbracoExamine/EventsTest.cs @@ -1,12 +1,7 @@ -using System; -using System.Linq; -using Examine; -using LightInject; -using Lucene.Net.Store; +using System.Linq; using NUnit.Framework; using Umbraco.Tests.Testing; using Umbraco.Examine; -using Umbraco.Core.PropertyEditors; namespace Umbraco.Tests.UmbracoExamine { diff --git a/src/Umbraco.Tests/UmbracoExamine/ExamineBaseTest.cs b/src/Umbraco.Tests/UmbracoExamine/ExamineBaseTest.cs index 9bd448dc38..ab8884cbaf 100644 --- a/src/Umbraco.Tests/UmbracoExamine/ExamineBaseTest.cs +++ b/src/Umbraco.Tests/UmbracoExamine/ExamineBaseTest.cs @@ -1,6 +1,7 @@ using System.IO; using Microsoft.Extensions.Logging.Abstractions; using NUnit.Framework; +using Umbraco.Core; using Umbraco.Core.Composing; using Umbraco.Core.Configuration.Models; using Umbraco.Core.Logging; @@ -34,7 +35,7 @@ namespace Umbraco.Tests.UmbracoExamine { base.Compose(); var requestHandlerSettings = new RequestHandlerSettings(); - Composition.RegisterUnique(_ => new DefaultShortStringHelper(Microsoft.Extensions.Options.Options.Create(requestHandlerSettings))); + Composition.Services.AddUnique(_ => new DefaultShortStringHelper(Microsoft.Extensions.Options.Options.Create(requestHandlerSettings))); } } } diff --git a/src/Umbraco.Tests/UmbracoExamine/IndexTest.cs b/src/Umbraco.Tests/UmbracoExamine/IndexTest.cs index 7b04e38e45..d62a900452 100644 --- a/src/Umbraco.Tests/UmbracoExamine/IndexTest.cs +++ b/src/Umbraco.Tests/UmbracoExamine/IndexTest.cs @@ -14,6 +14,7 @@ using Umbraco.Core.Models; using Newtonsoft.Json; using System.Collections.Generic; using System; +using Microsoft.Extensions.DependencyInjection; using Umbraco.Core; using Umbraco.Tests.TestHelpers; diff --git a/src/Umbraco.Tests/UmbracoExamine/SearchTests.cs b/src/Umbraco.Tests/UmbracoExamine/SearchTests.cs index 6186e5f782..67e54e440e 100644 --- a/src/Umbraco.Tests/UmbracoExamine/SearchTests.cs +++ b/src/Umbraco.Tests/UmbracoExamine/SearchTests.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using Examine; using Examine.Search; +using Microsoft.Extensions.DependencyInjection; using NUnit.Framework; using Moq; using Umbraco.Core; diff --git a/src/Umbraco.Tests/Web/Controllers/AuthenticationControllerTests.cs b/src/Umbraco.Tests/Web/Controllers/AuthenticationControllerTests.cs index aa329d2b48..0cb990df3d 100644 --- a/src/Umbraco.Tests/Web/Controllers/AuthenticationControllerTests.cs +++ b/src/Umbraco.Tests/Web/Controllers/AuthenticationControllerTests.cs @@ -51,12 +51,12 @@ namespace Umbraco.Tests.Web.Controllers // replace the true IUserService implementation with a mock // so that each test can configure the service to their liking - Composition.RegisterUnique(f => Mock.Of()); + Composition.Services.AddUnique(f => Mock.Of()); // kill the true IEntityService too - Composition.RegisterUnique(f => Mock.Of()); + Composition.Services.AddUnique(f => Mock.Of()); - Composition.RegisterUnique(); + Composition.Services.AddUnique(); } diff --git a/src/Umbraco.Tests/Web/UmbracoHelperTests.cs b/src/Umbraco.Tests/Web/UmbracoHelperTests.cs deleted file mode 100644 index 66c9395c59..0000000000 --- a/src/Umbraco.Tests/Web/UmbracoHelperTests.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System; -using System.IO; -using System.Text; -using Microsoft.Extensions.Logging; -using Moq; -using NUnit.Framework; -using Umbraco.Core; -using Umbraco.Core.Cache; -using Umbraco.Core.Composing; -using Umbraco.Core.Logging; -using Umbraco.Tests.TestHelpers; -using Umbraco.Web; -using Current = Umbraco.Web.Composing.Current; - - -namespace Umbraco.Tests.Web -{ - - [TestFixture] - public class UmbracoHelperTests - { - - [TearDown] - public void TearDown() - { - Current.Reset(); - } - - private void SetUpDependencyContainer() - { - // FIXME: bad in a unit test - but Udi has a static ctor that wants it?! - var container = new Mock(); - var typeFinder = TestHelper.GetTypeFinder(); - var ioHelper = TestHelper.IOHelper; - container - .Setup(x => x.GetRequiredService(typeof(TypeLoader))) - .Returns(new TypeLoader( - typeFinder, - NoAppCache.Instance, - new DirectoryInfo(ioHelper.MapPath("~/App_Data/TEMP")), - Mock.Of>(), - new ProfilingLogger(Mock.Of(), Mock.Of()) - ) - ); - - Current.Factory = container.Object; - } - } -} diff --git a/src/Umbraco.Web.BackOffice/Runtime/BackOfficeComposer.cs b/src/Umbraco.Web.BackOffice/Runtime/BackOfficeComposer.cs index d15d419089..78b7317362 100644 --- a/src/Umbraco.Web.BackOffice/Runtime/BackOfficeComposer.cs +++ b/src/Umbraco.Web.BackOffice/Runtime/BackOfficeComposer.cs @@ -24,14 +24,14 @@ namespace Umbraco.Web.BackOffice.Runtime { public void Compose(Composition composition) { - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); composition.Services.AddScoped(); composition.Services.AddScoped(); - composition.RegisterUnique(); - composition.RegisterUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); // register back office trees // the collection builder only accepts types inheriting from TreeControllerBase @@ -42,15 +42,15 @@ namespace Umbraco.Web.BackOffice.Runtime composition.ComposeWebMappingProfiles(); - composition.RegisterUnique(factory => + composition.Services.AddUnique(factory => new PhysicalFileSystem( factory.GetRequiredService(), factory.GetRequiredService(), factory.GetRequiredService>(), "~/")); - composition.RegisterUnique(); - composition.RegisterUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); composition.ComposeUmbracoBackOfficeControllers(); } diff --git a/src/Umbraco.Web.BackOffice/Trees/TreeCollectionBuilder.cs b/src/Umbraco.Web.BackOffice/Trees/TreeCollectionBuilder.cs index 98438d952b..a82731f777 100644 --- a/src/Umbraco.Web.BackOffice/Trees/TreeCollectionBuilder.cs +++ b/src/Umbraco.Web.BackOffice/Trees/TreeCollectionBuilder.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using Microsoft.Extensions.DependencyInjection; using Umbraco.Core; using Umbraco.Core.Composing; using Umbraco.Web.Trees; @@ -13,9 +14,10 @@ namespace Umbraco.Web.BackOffice.Trees { private readonly List _trees = new List(); - public TreeCollection CreateCollection(IFactory factory) => new TreeCollection(_trees); + public TreeCollection CreateCollection(IServiceProvider factory) => new TreeCollection(_trees); + + public void RegisterWith(IServiceCollection services) => services.Add(new ServiceDescriptor(typeof(TreeCollection), CreateCollection, ServiceLifetime.Singleton)); - public void RegisterWith(IRegister register) => register.Register(CreateCollection, Lifetime.Singleton); /// /// Registers a custom tree definition diff --git a/src/Umbraco.Web.Common/Builder/UmbracoBuilderExtensions.cs b/src/Umbraco.Web.Common/Builder/UmbracoBuilderExtensions.cs index 3a251fff9e..1d13c4c712 100644 --- a/src/Umbraco.Web.Common/Builder/UmbracoBuilderExtensions.cs +++ b/src/Umbraco.Web.Common/Builder/UmbracoBuilderExtensions.cs @@ -5,6 +5,7 @@ using Microsoft.AspNetCore.Server.Kestrel.Core; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using System; +using Umbraco.Core; using Umbraco.Extensions; using Umbraco.Web.Common.Filters; using Umbraco.Web.Common.ModelBinders; @@ -20,6 +21,8 @@ namespace Umbraco.Web.Common.Builder if (webHostEnvironment is null) throw new ArgumentNullException(nameof(webHostEnvironment)); if (config is null) throw new ArgumentNullException(nameof(config)); + services.AddLazySupport(); + var builder = new UmbracoBuilder(services, webHostEnvironment, config); return builder; } diff --git a/src/Umbraco.Web.Common/Extensions/CompositionExtensions.cs b/src/Umbraco.Web.Common/Extensions/CompositionExtensions.cs index 2ce003d226..ae648f9c8a 100644 --- a/src/Umbraco.Web.Common/Extensions/CompositionExtensions.cs +++ b/src/Umbraco.Web.Common/Extensions/CompositionExtensions.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.DependencyInjection; using Umbraco.Core.Composing; using Umbraco.Web.Common.Controllers; using Umbraco.Web.Mvc; @@ -14,7 +15,7 @@ namespace Umbraco.Extensions public static void RegisterControllers(this Composition composition, IEnumerable controllerTypes) { foreach (var controllerType in controllerTypes) - composition.Register(controllerType, Lifetime.Request); + composition.Services.AddScoped(controllerType); } } } diff --git a/src/Umbraco.Web.Common/Extensions/UmbracoCoreServiceCollectionExtensions.cs b/src/Umbraco.Web.Common/Extensions/UmbracoCoreServiceCollectionExtensions.cs index e870bb177a..1a157a74be 100644 --- a/src/Umbraco.Web.Common/Extensions/UmbracoCoreServiceCollectionExtensions.cs +++ b/src/Umbraco.Web.Common/Extensions/UmbracoCoreServiceCollectionExtensions.cs @@ -26,7 +26,6 @@ using Umbraco.Core.Logging.Serilog; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.SqlSyntax; using Umbraco.Core.Runtime; -using Umbraco.Infrastructure.Composing; using Umbraco.Web.Common.AspNetCore; using Umbraco.Web.Common.Profiler; using ConnectionStrings = Umbraco.Core.Configuration.Models.ConnectionStrings; @@ -112,12 +111,11 @@ namespace Umbraco.Extensions /// public static IServiceCollection AddUmbracoCore(this IServiceCollection services, IWebHostEnvironment webHostEnvironment, - IRegister umbContainer, Assembly entryAssembly, AppCaches appCaches, ILoggingConfiguration loggingConfiguration, IConfiguration configuration) - => services.AddUmbracoCore(webHostEnvironment, umbContainer, entryAssembly, appCaches, loggingConfiguration, configuration, GetCoreRuntime); + => services.AddUmbracoCore(webHostEnvironment, entryAssembly, appCaches, loggingConfiguration, configuration, GetCoreRuntime); /// /// Adds the Umbraco Configuration requirements @@ -169,7 +167,6 @@ namespace Umbraco.Extensions /// public static IServiceCollection AddUmbracoCore(this IServiceCollection services, IWebHostEnvironment webHostEnvironment, IConfiguration configuration) { - var loggingConfig = new LoggingConfiguration( Path.Combine(webHostEnvironment.ContentRootPath, "umbraco", "logs")); @@ -183,15 +180,7 @@ namespace Umbraco.Extensions requestCache, new IsolatedCaches(type => new DeepCloneAppCache(new ObjectCacheAppCache()))); - /* TODO: MSDI - Post initial merge we can clean up a lot. - * Change the method signatures lower down - * Or even just remove IRegister / IFactory interfaces entirely. - * If we try to do it immediately, merging becomes a nightmare. - */ - var register = new ServiceCollectionRegistryAdapter(services); - services.AddUmbracoCore(webHostEnvironment, - register, Assembly.GetEntryAssembly(), appCaches, loggingConfig, @@ -217,7 +206,6 @@ namespace Umbraco.Extensions public static IServiceCollection AddUmbracoCore( this IServiceCollection services, IWebHostEnvironment webHostEnvironment, - IRegister umbContainer, Assembly entryAssembly, AppCaches appCaches, ILoggingConfiguration loggingConfiguration, @@ -226,10 +214,10 @@ namespace Umbraco.Extensions Func getRuntime) { if (services is null) throw new ArgumentNullException(nameof(services)); - var container = umbContainer; - if (container is null) throw new ArgumentNullException(nameof(container)); if (entryAssembly is null) throw new ArgumentNullException(nameof(entryAssembly)); + services.AddLazySupport(); + // Add service session // This can be overwritten by the user by adding their own call to AddSession // since the last call of AddSession take precedence diff --git a/src/Umbraco.Web.Common/Profiler/WebProfilerComposer.cs b/src/Umbraco.Web.Common/Profiler/WebProfilerComposer.cs index edb3db6f85..fd8f275291 100644 --- a/src/Umbraco.Web.Common/Profiler/WebProfilerComposer.cs +++ b/src/Umbraco.Web.Common/Profiler/WebProfilerComposer.cs @@ -9,7 +9,7 @@ namespace Umbraco.Web.Common.Profiler { base.Compose(composition); - composition.RegisterUnique(); + composition.Services.AddUnique(); } } } diff --git a/src/Umbraco.Web.Common/Runtime/AspNetCoreBootFailedComposer.cs b/src/Umbraco.Web.Common/Runtime/AspNetCoreBootFailedComposer.cs index 010e6533d9..fa2e090578 100644 --- a/src/Umbraco.Web.Common/Runtime/AspNetCoreBootFailedComposer.cs +++ b/src/Umbraco.Web.Common/Runtime/AspNetCoreBootFailedComposer.cs @@ -12,7 +12,7 @@ namespace Umbraco.Web.Common.Runtime { public void Compose(Composition composition) { - composition.RegisterUnique(); + composition.Services.AddUnique(); } } } diff --git a/src/Umbraco.Web.Common/Runtime/AspNetCoreComposer.cs b/src/Umbraco.Web.Common/Runtime/AspNetCoreComposer.cs index cb247cff60..39742dcb0d 100644 --- a/src/Umbraco.Web.Common/Runtime/AspNetCoreComposer.cs +++ b/src/Umbraco.Web.Common/Runtime/AspNetCoreComposer.cs @@ -45,39 +45,42 @@ namespace Umbraco.Web.Common.Runtime base.Compose(composition); // AspNetCore specific services - composition.RegisterUnique(); - composition.RegisterUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); // Our own netcore implementations - composition.RegisterMultipleUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); - composition.RegisterUnique(); + composition.Services.AddUnique(); // The umbraco request lifetime - composition.RegisterMultipleUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); //Password hasher - composition.RegisterUnique(); + composition.Services.AddUnique(); - composition.RegisterUnique(); + composition.Services.AddUnique(); composition.Services.AddTransient(); - composition.RegisterUnique(); + composition.Services.AddUnique(); - composition.RegisterMultipleUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); - composition.RegisterUnique(); + composition.Services.AddUnique(); - composition.RegisterUnique(); + composition.Services.AddUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); // register the umbraco context factory - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); //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 @@ -89,17 +92,17 @@ namespace Umbraco.Web.Common.Runtime .Add(umbracoApiControllerTypes); - composition.RegisterUnique(); + composition.Services.AddUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); - composition.RegisterUnique(); + composition.Services.AddUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(); - composition.RegisterUnique(factory => new LegacyPasswordSecurity()); + composition.Services.AddUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(factory => new LegacyPasswordSecurity()); } } } diff --git a/src/Umbraco.Web.Common/RuntimeMinification/SmidgeComposer.cs b/src/Umbraco.Web.Common/RuntimeMinification/SmidgeComposer.cs index 3ceba06c62..3400ee49d9 100644 --- a/src/Umbraco.Web.Common/RuntimeMinification/SmidgeComposer.cs +++ b/src/Umbraco.Web.Common/RuntimeMinification/SmidgeComposer.cs @@ -11,13 +11,11 @@ namespace Umbraco.Web.Common.RuntimeMinification { public void Compose(Composition composition) { - // TODO: For this to work we need to have services.AddSmidge() based on the Smidge APIs but our composer APIs don't really let us do that // This makes it a bit awkward to boot the runtime since that call would need to be made outside of the composer... .hrm... - - composition.RegisterUnique(); - composition.RegisterUnique(); + composition.Services.AddUnique(); + composition.Services.AddUnique(); composition.Services.AddTransient(); } } diff --git a/src/Umbraco.Web.UI/Views/Partials/Grid/Editors/Rte.cshtml b/src/Umbraco.Web.UI/Views/Partials/Grid/Editors/Rte.cshtml index 0aef9d10ca..715aad12d6 100644 --- a/src/Umbraco.Web.UI/Views/Partials/Grid/Editors/Rte.cshtml +++ b/src/Umbraco.Web.UI/Views/Partials/Grid/Editors/Rte.cshtml @@ -1,6 +1,13 @@ @model dynamic @using Umbraco.Web.Composing @using Umbraco.Web.Templates + +@* + TODO: When this project is asp.net core we can @inject HtmlLocalLinkParser etc (or come up with something even better) +*@ + +@using Microsoft.Extensions.DependencyInjection + @{ var htmlLocalLinkParser = Current.Factory.GetRequiredService(); var htmlUrlParser = Current.Factory.GetRequiredService(); diff --git a/src/Umbraco.Web/Composing/Current.cs b/src/Umbraco.Web/Composing/Current.cs index 0fd7a02444..d49aca86d5 100644 --- a/src/Umbraco.Web/Composing/Current.cs +++ b/src/Umbraco.Web/Composing/Current.cs @@ -1,4 +1,5 @@ using System; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Umbraco.Core; using Umbraco.Core.Cache; @@ -38,17 +39,18 @@ using Umbraco.Web.WebApi; namespace Umbraco.Web.Composing { + // TODO: MSDI - let's kill this class once and for all... // see notes in Umbraco.Core.Composing.Current. public static class Current { private static readonly object Locker = new object(); - private static IFactory _factory; + private static IServiceProvider _factory; /// /// Gets or sets the factory. /// - public static IFactory Factory + public static IServiceProvider Factory { get { @@ -58,44 +60,12 @@ namespace Umbraco.Web.Composing } set { - if (_factory != null) - throw new InvalidOperationException("A factory has already been set."); _factory = value; } } private static IUmbracoContextAccessor _umbracoContextAccessor; - static Current() - { - Resetted += (sender, args) => - { - if (_umbracoContextAccessor != null) - { - var umbracoContext = _umbracoContextAccessor.UmbracoContext; - umbracoContext?.Dispose(); - } - _umbracoContextAccessor = null; - }; - } - - /// - /// for UNIT TESTS exclusively! Resets . Indented for testing only, and not supported in production code. - /// - /// - /// For UNIT TESTS exclusively. - /// Resets everything that is 'current'. - /// - public static void Reset() - { - _factory.DisposeIfDisposable(); - _factory = null; - - Resetted?.Invoke(null, EventArgs.Empty); - } - - internal static event EventHandler Resetted; - #region Temp & Special diff --git a/src/Umbraco.Web/Composing/ModuleInjector.cs b/src/Umbraco.Web/Composing/ModuleInjector.cs index e21b585ab7..5cfec1c484 100644 --- a/src/Umbraco.Web/Composing/ModuleInjector.cs +++ b/src/Umbraco.Web/Composing/ModuleInjector.cs @@ -1,4 +1,5 @@ using System.Web; +using Microsoft.Extensions.DependencyInjection; using Umbraco.Core; using Umbraco.Core.Composing; using Umbraco.Core.Exceptions; diff --git a/src/Umbraco.Web/CompositionExtensions.cs b/src/Umbraco.Web/CompositionExtensions.cs index add809c79f..d96e21aa3d 100644 --- a/src/Umbraco.Web/CompositionExtensions.cs +++ b/src/Umbraco.Web/CompositionExtensions.cs @@ -2,7 +2,6 @@ using Microsoft.Extensions.DependencyInjection; using Umbraco.Core; using Umbraco.Core.Composing; -using Umbraco.Infrastructure.Composing; using Umbraco.Web.Actions; using Umbraco.Web.ContentApps; using Umbraco.Web.Dashboards; @@ -30,10 +29,11 @@ namespace Umbraco.Web /// public static class WebCompositionExtensions { - public static IFactory CreateFactory(this Composition composition) + [Obsolete("This extension method exists only to ease migration, please refactor")] + public static IServiceProvider CreateServiceProvider(this Composition composition) { composition.RegisterBuilders(); - return ServiceProviderFactoryAdapter.Wrap(composition.Services.BuildServiceProvider()); + return composition.Services.BuildServiceProvider(); } #region Uniques @@ -44,9 +44,9 @@ namespace Umbraco.Web /// The type of the content last chance finder. /// The composition. public static void SetContentLastChanceFinder(this Composition composition) - where T : IContentLastChanceFinder + where T : class, IContentLastChanceFinder { - composition.RegisterUnique(); + composition.Services.AddUnique(); } /// @@ -54,9 +54,9 @@ namespace Umbraco.Web /// /// The composition. /// A function creating a last chance finder. - public static void SetContentLastChanceFinder(this Composition composition, Func factory) + public static void SetContentLastChanceFinder(this Composition composition, Func factory) { - composition.RegisterUnique(factory); + composition.Services.AddUnique(factory); } /// @@ -66,7 +66,7 @@ namespace Umbraco.Web /// A last chance finder. public static void SetContentLastChanceFinder(this Composition composition, IContentLastChanceFinder finder) { - composition.RegisterUnique(_ => finder); + composition.Services.AddUnique(_ => finder); } /// @@ -75,9 +75,9 @@ namespace Umbraco.Web /// The type of the site domain helper. /// public static void SetSiteDomainHelper(this Composition composition) - where T : ISiteDomainHelper + where T : class, ISiteDomainHelper { - composition.RegisterUnique(); + composition.Services.AddUnique(); } /// @@ -85,9 +85,9 @@ namespace Umbraco.Web /// /// The composition. /// A function creating a helper. - public static void SetSiteDomainHelper(this Composition composition, Func factory) + public static void SetSiteDomainHelper(this Composition composition, Func factory) { - composition.RegisterUnique(factory); + composition.Services.AddUnique(factory); } /// @@ -97,7 +97,7 @@ namespace Umbraco.Web /// A helper. public static void SetSiteDomainHelper(this Composition composition, ISiteDomainHelper helper) { - composition.RegisterUnique(_ => helper); + composition.Services.AddUnique(_ => helper); } #endregion diff --git a/src/Umbraco.Web/Mvc/EnsurePublishedContentRequestAttribute.cs b/src/Umbraco.Web/Mvc/EnsurePublishedContentRequestAttribute.cs index e9d39849eb..3ca7e861ac 100644 --- a/src/Umbraco.Web/Mvc/EnsurePublishedContentRequestAttribute.cs +++ b/src/Umbraco.Web/Mvc/EnsurePublishedContentRequestAttribute.cs @@ -1,5 +1,6 @@ using System; using System.Web.Mvc; +using Microsoft.Extensions.DependencyInjection; using Umbraco.Web.Routing; using Umbraco.Core; using Umbraco.Core.Composing; diff --git a/src/Umbraco.Web/Mvc/PluginController.cs b/src/Umbraco.Web/Mvc/PluginController.cs index 4490c8dda5..59521255c9 100644 --- a/src/Umbraco.Web/Mvc/PluginController.cs +++ b/src/Umbraco.Web/Mvc/PluginController.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Concurrent; using System.Web.Mvc; +using Microsoft.Extensions.DependencyInjection; using Umbraco.Core; using Umbraco.Core.Cache; using Umbraco.Core.Composing; diff --git a/src/Umbraco.Web/Mvc/RenderRouteHandler.cs b/src/Umbraco.Web/Mvc/RenderRouteHandler.cs index 7ba870553b..cbad7de789 100644 --- a/src/Umbraco.Web/Mvc/RenderRouteHandler.cs +++ b/src/Umbraco.Web/Mvc/RenderRouteHandler.cs @@ -4,6 +4,7 @@ using System.Web; using System.Web.Mvc; using System.Web.Routing; using System.Web.SessionState; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Umbraco.Core; using Umbraco.Core.Composing; diff --git a/src/Umbraco.Web/Mvc/UmbracoViewPageOfTModel.cs b/src/Umbraco.Web/Mvc/UmbracoViewPageOfTModel.cs index 43c3102a62..503ea59550 100644 --- a/src/Umbraco.Web/Mvc/UmbracoViewPageOfTModel.cs +++ b/src/Umbraco.Web/Mvc/UmbracoViewPageOfTModel.cs @@ -3,6 +3,7 @@ using System.Text; using System.Web; using System.Web.Mvc; using System.Web.WebPages; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Umbraco.Core; using Umbraco.Core.Cache; diff --git a/src/Umbraco.Web/Mvc/UmbracoVirtualNodeRouteHandler.cs b/src/Umbraco.Web/Mvc/UmbracoVirtualNodeRouteHandler.cs index 38d89aef59..c00eb24cca 100644 --- a/src/Umbraco.Web/Mvc/UmbracoVirtualNodeRouteHandler.cs +++ b/src/Umbraco.Web/Mvc/UmbracoVirtualNodeRouteHandler.cs @@ -1,6 +1,7 @@ using System.Web; using System.Web.Mvc; using System.Web.Routing; +using Microsoft.Extensions.DependencyInjection; using Umbraco.Core.Models.PublishedContent; using Umbraco.Web.Models; using Umbraco.Web.Routing; diff --git a/src/Umbraco.Web/PublishedContentExtensions.cs b/src/Umbraco.Web/PublishedContentExtensions.cs index 5891f3abb4..14ba06610e 100644 --- a/src/Umbraco.Web/PublishedContentExtensions.cs +++ b/src/Umbraco.Web/PublishedContentExtensions.cs @@ -4,6 +4,7 @@ using System.Data; using System.Linq; using System.Web; using Examine; +using Microsoft.Extensions.DependencyInjection; using Umbraco.Core; using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.Models.PublishedContent; diff --git a/src/Umbraco.Web/Runtime/WebInitialComposer.cs b/src/Umbraco.Web/Runtime/WebInitialComposer.cs index 3cfe3f409a..5f227b37ad 100644 --- a/src/Umbraco.Web/Runtime/WebInitialComposer.cs +++ b/src/Umbraco.Web/Runtime/WebInitialComposer.cs @@ -31,28 +31,28 @@ namespace Umbraco.Web.Runtime // register membership stuff - composition.Register(factory => MembershipProviderExtensions.GetMembersMembershipProvider()); - composition.Register(factory => Roles.Enabled ? Roles.Provider : new MembersRoleProvider(factory.GetRequiredService())); + composition.Services.AddTransient(factory => MembershipProviderExtensions.GetMembersMembershipProvider()); + composition.Services.AddTransient(factory => Roles.Enabled ? Roles.Provider : new MembersRoleProvider(factory.GetRequiredService())); composition.Services.AddScoped(); - composition.Register(factory => factory.GetRequiredService().PublishedSnapshot.Members); - composition.RegisterUnique(); - composition.RegisterUnique(); + composition.Services.AddTransient(factory => factory.GetRequiredService().PublishedSnapshot.Members); + composition.Services.AddUnique(); + composition.Services.AddUnique(); // register the umbraco helper - this is Transient! very important! // also, if not level.Run, we cannot really use the helper (during upgrade...) // so inject a "void" helper (not exactly pretty but...) if (composition.RuntimeState.Level == RuntimeLevel.Run) - composition.Register(factory => + composition.Services.AddTransient(factory => { var umbCtx = factory.GetRequiredService(); return new UmbracoHelper(umbCtx.IsFrontEndUmbracoRequest ? umbCtx.PublishedRequest?.PublishedContent : null, factory.GetRequiredService(), factory.GetRequiredService(), factory.GetRequiredService()); }); else - composition.Register(_ => new UmbracoHelper()); + composition.Services.AddTransient(_ => new UmbracoHelper()); - composition.RegisterUnique(); + composition.Services.AddUnique(); // configure the container for web //composition.ConfigureForWeb(); diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 31202255dd..a881e3f704 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -73,13 +73,6 @@ 2.7.0.100 - - - - - 2.0.0 - - diff --git a/src/Umbraco.Web/UmbracoApplicationBase.cs b/src/Umbraco.Web/UmbracoApplicationBase.cs index 8ca7aac038..83f056c77d 100644 --- a/src/Umbraco.Web/UmbracoApplicationBase.cs +++ b/src/Umbraco.Web/UmbracoApplicationBase.cs @@ -22,7 +22,6 @@ using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Logging.Serilog; using Umbraco.Core.Logging.Serilog.Enrichers; -using Umbraco.Infrastructure.Composing; using Umbraco.Net; using Umbraco.Web.Hosting; using Umbraco.Web.Logging; @@ -44,7 +43,7 @@ namespace Umbraco.Web private readonly ConnectionStrings _connectionStrings; private readonly IIOHelper _ioHelper; private IRuntime _runtime; - private IFactory _factory; + private IServiceProvider _factory; private ILoggerFactory _loggerFactory; protected UmbracoApplicationBase() @@ -145,9 +144,9 @@ namespace Umbraco.Web /// /// Gets the application register. /// - protected virtual IRegister GetRegister(GlobalSettings globalSettings) + protected virtual IServiceCollection GetRegister(GlobalSettings globalSettings) { - return ServiceCollectionRegistryAdapter.Wrap(new ServiceCollection()); + return new ServiceCollection(); } // events - in the order they trigger @@ -285,8 +284,6 @@ namespace Umbraco.Web } Current.Logger.DisposeIfDisposable(); - // dispose the container and everything - Current.Reset(); } // called by ASP.NET (auto event wireup) once per app domain diff --git a/src/Umbraco.Web/UmbracoDefaultOwinStartup.cs b/src/Umbraco.Web/UmbracoDefaultOwinStartup.cs index caa3f441df..e14c889492 100644 --- a/src/Umbraco.Web/UmbracoDefaultOwinStartup.cs +++ b/src/Umbraco.Web/UmbracoDefaultOwinStartup.cs @@ -1,4 +1,5 @@ using System; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Microsoft.Owin; using Owin; diff --git a/src/Umbraco.Web/WebApi/Filters/FeatureAuthorizeAttribute.cs b/src/Umbraco.Web/WebApi/Filters/FeatureAuthorizeAttribute.cs index eb0c36e189..148e8638eb 100644 --- a/src/Umbraco.Web/WebApi/Filters/FeatureAuthorizeAttribute.cs +++ b/src/Umbraco.Web/WebApi/Filters/FeatureAuthorizeAttribute.cs @@ -3,6 +3,7 @@ using System.Web.Http.Controllers; using Umbraco.Web.Composing; using Umbraco.Web.Features; using Umbraco.Core; +using Microsoft.Extensions.DependencyInjection; namespace Umbraco.Web.WebApi.Filters { diff --git a/src/Umbraco.Web/WebApi/HttpActionContextExtensions.cs b/src/Umbraco.Web/WebApi/HttpActionContextExtensions.cs index ced67bc791..f41dcac6eb 100644 --- a/src/Umbraco.Web/WebApi/HttpActionContextExtensions.cs +++ b/src/Umbraco.Web/WebApi/HttpActionContextExtensions.cs @@ -5,6 +5,7 @@ using System.Net.Http; using System.Threading.Tasks; using System.Web.Http; using System.Web.Http.Controllers; +using Microsoft.Extensions.DependencyInjection; using Newtonsoft.Json; using Umbraco.Web.Composing; using Umbraco.Core.IO; diff --git a/src/Umbraco.Web/WebApi/UmbracoApiControllerBase.cs b/src/Umbraco.Web/WebApi/UmbracoApiControllerBase.cs index 308358f4e8..99a9a63487 100644 --- a/src/Umbraco.Web/WebApi/UmbracoApiControllerBase.cs +++ b/src/Umbraco.Web/WebApi/UmbracoApiControllerBase.cs @@ -1,6 +1,7 @@ using System; using System.Web; using System.Web.Http; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Owin; using Umbraco.Core; using Umbraco.Core.Cache; diff --git a/src/Umbraco.Web/WebAssets/CDF/ClientDependencyComposer.cs b/src/Umbraco.Web/WebAssets/CDF/ClientDependencyComposer.cs index 3fb7399a2b..bb8c2be059 100644 --- a/src/Umbraco.Web/WebAssets/CDF/ClientDependencyComposer.cs +++ b/src/Umbraco.Web/WebAssets/CDF/ClientDependencyComposer.cs @@ -9,7 +9,7 @@ namespace Umbraco.Web.WebAssets.CDF public override void Compose(Composition composition) { base.Compose(composition); - composition.RegisterUnique(); + composition.Services.AddUnique(); } } }