Browse Source

Equalize IAbpLazyServiceProvider and ITransientCachedServiceProvider

To reduce cached service provider service count.
pull/14879/head
Halil İbrahim Kalkan 4 years ago
parent
commit
0a061ad4e3
  1. 29
      framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/AbpLazyServiceProvider.cs
  2. 26
      framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/CachedServiceProviderBase.cs
  3. 26
      framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IAbpLazyServiceProvider.cs
  4. 6
      framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ICachedServiceProvider.cs
  5. 14
      framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ICachedServiceProviderBase.cs
  6. 4
      framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ITransientCachedServiceProvider.cs

29
framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/AbpLazyServiceProvider.cs

@ -3,6 +3,10 @@ using Microsoft.Extensions.DependencyInjection;
namespace Volo.Abp.DependencyInjection;
/// <summary>
/// This class is equivalent of the <see cref="TransientCachedServiceProvider"/>.
/// Use <see cref="TransientCachedServiceProvider"/> instead of this class, for new projects.
/// </summary>
[ExposeServices(typeof(IAbpLazyServiceProvider))]
public class AbpLazyServiceProvider :
CachedServiceProviderBase,
@ -13,29 +17,8 @@ public class AbpLazyServiceProvider :
: base(serviceProvider)
{
}
public T GetService<T>(T defaultValue)
{
return (T)GetService(typeof(T), defaultValue);
}
public object GetService(Type serviceType, object defaultValue)
{
return GetService(serviceType) ?? defaultValue;
}
public T GetService<T>(Func<IServiceProvider, object> factory)
{
return (T)GetService(typeof(T), factory);
}
public object GetService(Type serviceType, Func<IServiceProvider, object> factory)
{
return CachedServices.GetOrAdd(
serviceType,
_ => new Lazy<object>(() => factory(ServiceProvider))
).Value;
}
#region Old Methods
public virtual T LazyGetRequiredService<T>()
{
@ -57,8 +40,6 @@ public class AbpLazyServiceProvider :
return GetService(serviceType);
}
#region Old Methods
public virtual T LazyGetService<T>(T defaultValue)
{
return GetService(defaultValue);

26
framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/CachedServiceProviderBase.cs

@ -1,10 +1,9 @@
using System;
using System.Collections.Concurrent;
using Microsoft.Extensions.DependencyInjection;
namespace Volo.Abp.DependencyInjection;
public abstract class CachedServiceProviderBase : IServiceProvider
public abstract class CachedServiceProviderBase : ICachedServiceProviderBase
{
protected IServiceProvider ServiceProvider { get; }
protected ConcurrentDictionary<Type, Lazy<object>> CachedServices { get; }
@ -23,4 +22,27 @@ public abstract class CachedServiceProviderBase : IServiceProvider
_ => new Lazy<object>(() => ServiceProvider.GetService(serviceType))
).Value;
}
public T GetService<T>(T defaultValue)
{
return (T)GetService(typeof(T), defaultValue);
}
public object GetService(Type serviceType, object defaultValue)
{
return GetService(serviceType) ?? defaultValue;
}
public T GetService<T>(Func<IServiceProvider, object> factory)
{
return (T)GetService(typeof(T), factory);
}
public object GetService(Type serviceType, Func<IServiceProvider, object> factory)
{
return CachedServices.GetOrAdd(
serviceType,
_ => new Lazy<object>(() => factory(ServiceProvider))
).Value;
}
}

26
framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/IAbpLazyServiceProvider.cs

@ -2,18 +2,12 @@
namespace Volo.Abp.DependencyInjection;
public interface IAbpLazyServiceProvider : IServiceProvider
/// <summary>
/// This service is equivalent of the <see cref="ITransientCachedServiceProvider"/>.
/// Use <see cref="ITransientCachedServiceProvider"/> instead of this interface, for new projects.
/// </summary>
public interface IAbpLazyServiceProvider : ICachedServiceProviderBase
{
T GetService<T>(T defaultValue);
object GetService(Type serviceType, object defaultValue);
T GetService<T>(Func<IServiceProvider, object> factory);
object GetService(Type serviceType, Func<IServiceProvider, object> factory);
#region Old Methods
/// <summary>
/// This method is equivalent of the GetRequiredService method.
/// It does exists for backward compatibility.
@ -39,28 +33,26 @@ public interface IAbpLazyServiceProvider : IServiceProvider
object LazyGetService(Type serviceType);
/// <summary>
/// This method is equivalent of the <see cref="GetService{T}(T)"/> method.
/// This method is equivalent of the <see cref="ICachedServiceProviderBase.GetService{T}(T)"/> method.
/// It does exists for backward compatibility.
/// </summary>
T LazyGetService<T>(T defaultValue);
/// <summary>
/// This method is equivalent of the <see cref="GetService(Type, object)"/> method.
/// This method is equivalent of the <see cref="ICachedServiceProviderBase.GetService(Type, object)"/> method.
/// It does exists for backward compatibility.
/// </summary>
object LazyGetService(Type serviceType, object defaultValue);
/// <summary>
/// This method is equivalent of the <see cref="GetService(Type, Func{IServiceProvider, object})"/> method.
/// This method is equivalent of the <see cref="ICachedServiceProviderBase.GetService(Type, Func{IServiceProvider, object})"/> method.
/// It does exists for backward compatibility.
/// </summary>
object LazyGetService(Type serviceType, Func<IServiceProvider, object> factory);
/// <summary>
/// This method is equivalent of the <see cref="GetService{T}(T)"/> method.
/// This method is equivalent of the <see cref="ICachedServiceProviderBase.GetService{T}(Func{IServiceProvider, object})"/> method.
/// It does exists for backward compatibility.
/// </summary>
T LazyGetService<T>(Func<IServiceProvider, object> factory);
#endregion
}

6
framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ICachedServiceProvider.cs

@ -1,6 +1,4 @@
using System;
namespace Volo.Abp.DependencyInjection;
namespace Volo.Abp.DependencyInjection;
/// <summary>
/// Provides services by caching the resolved services.
@ -8,7 +6,7 @@ namespace Volo.Abp.DependencyInjection;
/// This service's lifetime is scoped and it should be used
/// for a limited scope.
/// </summary>
public interface ICachedServiceProvider : IServiceProvider
public interface ICachedServiceProvider : ICachedServiceProviderBase
{
}

14
framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ICachedServiceProviderBase.cs

@ -0,0 +1,14 @@
using System;
namespace Volo.Abp.DependencyInjection;
public interface ICachedServiceProviderBase : IServiceProvider
{
T GetService<T>(T defaultValue);
object GetService(Type serviceType, object defaultValue);
T GetService<T>(Func<IServiceProvider, object> factory);
object GetService(Type serviceType, Func<IServiceProvider, object> factory);
}

4
framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/ITransientCachedServiceProvider.cs

@ -1,5 +1,3 @@
using System;
namespace Volo.Abp.DependencyInjection;
/// <summary>
@ -8,7 +6,7 @@ namespace Volo.Abp.DependencyInjection;
/// This service's lifetime is transient.
/// <see cref="ICachedServiceProvider"/> for the one with scoped lifetime.
/// </summary>
public interface ITransientCachedServiceProvider : IServiceProvider
public interface ITransientCachedServiceProvider : ICachedServiceProviderBase
{
}
Loading…
Cancel
Save