mirror of https://github.com/abpframework/abp.git
5 changed files with 125 additions and 44 deletions
@ -0,0 +1,60 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using Microsoft.Extensions.DependencyInjection; |
||||
|
|
||||
|
namespace Volo.Abp.DependencyInjection |
||||
|
{ |
||||
|
public class AbpLazyServiceProvider : IAbpLazyServiceProvider, ITransientDependency |
||||
|
{ |
||||
|
protected IDictionary<Type, Lazy<object>> CachedTypes { get; set; } |
||||
|
|
||||
|
protected IServiceProvider ServiceProvider { get; set; } |
||||
|
|
||||
|
public AbpLazyServiceProvider(IServiceProvider serviceProvider) |
||||
|
{ |
||||
|
ServiceProvider = serviceProvider; |
||||
|
|
||||
|
CachedTypes = new Dictionary<Type, Lazy<object>>(); |
||||
|
} |
||||
|
|
||||
|
public virtual T LazyGetRequiredService<T>() |
||||
|
{ |
||||
|
return (T)CachedTypes.GetOrAdd(typeof(T), () => new Lazy<object>(() => (T) ServiceProvider.GetRequiredService(typeof(T)))).Value; |
||||
|
} |
||||
|
|
||||
|
public virtual object LazyGetRequiredService(Type serviceType) |
||||
|
{ |
||||
|
return CachedTypes.GetOrAdd(serviceType, () => new Lazy<object>(() => ServiceProvider.GetRequiredService(serviceType))).Value; |
||||
|
} |
||||
|
|
||||
|
public virtual T LazyGetService<T>() |
||||
|
{ |
||||
|
return (T)CachedTypes.GetOrAdd(typeof(T), () => new Lazy<object>(() => (T) ServiceProvider.GetService(typeof(T)))).Value; |
||||
|
} |
||||
|
|
||||
|
public virtual object LazyGetService(Type serviceType) |
||||
|
{ |
||||
|
return CachedTypes.GetOrAdd(serviceType, () => new Lazy<object>(() => ServiceProvider.GetService(serviceType))).Value; |
||||
|
} |
||||
|
|
||||
|
public virtual T LazyGetService<T>(T defaultValue) |
||||
|
{ |
||||
|
return LazyGetService<T>() ?? defaultValue; |
||||
|
} |
||||
|
|
||||
|
public virtual object LazyGetService(Type serviceType, object defaultValue) |
||||
|
{ |
||||
|
return LazyGetService(serviceType) ?? defaultValue; |
||||
|
} |
||||
|
|
||||
|
public virtual object LazyGetService(Type serviceType, Func<IServiceProvider, object> factory) |
||||
|
{ |
||||
|
return CachedTypes.GetOrAdd(serviceType, () => new Lazy<object>(() => factory(ServiceProvider))).Value; |
||||
|
} |
||||
|
|
||||
|
public virtual T LazyGetService<T>(Func<IServiceProvider, object> factory) |
||||
|
{ |
||||
|
return (T)CachedTypes.GetOrAdd(typeof(T), () => new Lazy<object>(() => factory(ServiceProvider))).Value; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,23 @@ |
|||||
|
using System; |
||||
|
|
||||
|
namespace Volo.Abp.DependencyInjection |
||||
|
{ |
||||
|
public interface IAbpLazyServiceProvider |
||||
|
{ |
||||
|
T LazyGetRequiredService<T>(); |
||||
|
|
||||
|
object LazyGetRequiredService(Type serviceType); |
||||
|
|
||||
|
T LazyGetService<T>(); |
||||
|
|
||||
|
object LazyGetService(Type serviceType); |
||||
|
|
||||
|
T LazyGetService<T>(T defaultValue); |
||||
|
|
||||
|
object LazyGetService(Type serviceType, object defaultValue); |
||||
|
|
||||
|
object LazyGetService(Type serviceType, Func<IServiceProvider, object> factory); |
||||
|
|
||||
|
T LazyGetService<T>(Func<IServiceProvider, object> factory); |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue