feat(Factory): add Factory class implementing IServiceProvider and IServiceCollection
- Introduced Factory class in DigitalData.Core.Abstractions namespace - Implements both IServiceProvider and IServiceCollection interfaces - Provides singleton instance via static readonly Instance property - Supports lazy initialization of IServiceProvider using Lazy<T> - Includes full collection management (Add, Remove, Clear, etc.) - Ensures compatibility with both .NET and .NET Framework via conditional directives
This commit is contained in:
parent
f500d9d974
commit
c538a8df8c
97
DigitalData.Core.Abstractions/Factory.cs
Normal file
97
DigitalData.Core.Abstractions/Factory.cs
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
using System.Collections;
|
||||||
|
#if NETFRAMEWORK
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace DigitalData.Core.Abstractions
|
||||||
|
{
|
||||||
|
public class Factory : IServiceProvider, IServiceCollection
|
||||||
|
{
|
||||||
|
public static readonly Factory Instance = new Factory();
|
||||||
|
|
||||||
|
private readonly IServiceCollection _serviceCollection = new ServiceCollection();
|
||||||
|
|
||||||
|
private readonly Lazy<IServiceProvider> _lazyServiceProvider;
|
||||||
|
|
||||||
|
public Factory()
|
||||||
|
{
|
||||||
|
_serviceCollection = new ServiceCollection();
|
||||||
|
_lazyServiceProvider = new Lazy<IServiceProvider>(() => _serviceCollection.BuildServiceProvider());
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Service Provider
|
||||||
|
public object
|
||||||
|
#if NET
|
||||||
|
?
|
||||||
|
#endif
|
||||||
|
GetService(Type serviceType)
|
||||||
|
{
|
||||||
|
return _lazyServiceProvider.Value;
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Service Collection
|
||||||
|
public int Count => _serviceCollection.Count;
|
||||||
|
|
||||||
|
public bool IsReadOnly => _serviceCollection.IsReadOnly;
|
||||||
|
|
||||||
|
public ServiceDescriptor this[int index]
|
||||||
|
{
|
||||||
|
get => _serviceCollection[index];
|
||||||
|
set => _serviceCollection[index] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int IndexOf(ServiceDescriptor item)
|
||||||
|
{
|
||||||
|
return _serviceCollection.IndexOf(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Insert(int index, ServiceDescriptor item)
|
||||||
|
{
|
||||||
|
_serviceCollection.Insert(index, item);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RemoveAt(int index)
|
||||||
|
{
|
||||||
|
_serviceCollection.RemoveAt(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Add(ServiceDescriptor item)
|
||||||
|
{
|
||||||
|
_serviceCollection.Add(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Clear()
|
||||||
|
{
|
||||||
|
_serviceCollection.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Contains(ServiceDescriptor item)
|
||||||
|
{
|
||||||
|
return _serviceCollection.Contains(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void CopyTo(ServiceDescriptor[] array, int arrayIndex)
|
||||||
|
{
|
||||||
|
_serviceCollection.CopyTo(array, arrayIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Remove(ServiceDescriptor item)
|
||||||
|
{
|
||||||
|
return _serviceCollection.Remove(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IEnumerator<ServiceDescriptor> GetEnumerator()
|
||||||
|
{
|
||||||
|
return _serviceCollection.GetEnumerator();
|
||||||
|
}
|
||||||
|
|
||||||
|
IEnumerator IEnumerable.GetEnumerator()
|
||||||
|
{
|
||||||
|
return (_serviceCollection as IEnumerable).GetEnumerator();
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user