13,346
社区成员
发帖
与我相关
我的任务
分享
public interface IDependencyInjectionContainer: IServiceProvider
{
void Register<TService>(string key, Func<TService> factory);
void Register<TService, TResult>(string key, Func<TService, TResult> factory);
void Register<TService>(Func<TService> factory);
void Register<TService>(Func<IDependencyInjectionContainer, TService> factory);
void Unregister(object instance);
TService Resolve<TService>();
TService Resolve<TService>(string key);
TService[] ResolveAll<TService>();
}
internal class DependencyInjectionContainer : IDependencyInjectionContainer, IServiceProvider
{
private readonly IDictionary<string, object> factories = new Dictionary<string, object>();
public void Register<TService>(Func<IDependencyInjectionContainer, TService> factory)
{
Register(() => factory(this));
}
public void Register<TService>(Func<TService> factory)
{
Register(typeof(TService).AssemblyQualifiedName, factory);
}
public void Register<TService, TResult>(string key, Func<TService, TResult> factory)
{
Register(key, () => factory(Resolve<TService>()));
}
public void Register<TService>(string key, Func<TService> factory)
{
factories[key] = factory;
}
public void Unregister(object instance)
{
if (factories.ContainsKey(instance.GetType().AssemblyQualifiedName))
{
factories.Remove(instance.GetType().AssemblyQualifiedName);
}
else
{
IDependencyInjectionContainer container = Resolve<IDependencyInjectionContainer>();
if (container != null)
{
container.Unregister(instance);
}
}
}
public TService Resolve<TService>()
{
object obj;
if (factories.TryGetValue(typeof(TService).AssemblyQualifiedName, out obj))
{
return ((Func<TService>)obj)();
}
else
{
IDependencyInjectionContainer container = Resolve<IDependencyInjectionContainer>();
if (container != null)
{
return container.Resolve<TService>();
}
}
return default(TService);
}
public TService Resolve<TService>(string key)
{
object obj;
if (factories.TryGetValue(key, out obj))
{
return ((Func<TService>)obj)();
}
else
{
IDependencyInjectionContainer container = Resolve<IDependencyInjectionContainer>();
if (container != null)
{
return container.Resolve<TService>(key);
}
}
return default(TService);
}
public TService[] ResolveAll<TService>()
{
List<TService> services = new List<TService>();
foreach (Func<TService> obj in factories.Values.OfType<Func<TService>>())
{
services.Add(obj());
}
IDependencyInjectionContainer container = Resolve<IDependencyInjectionContainer>();
if (container != null)
{
services.AddRange(container.ResolveAll<TService>());
}
return services.ToArray();
}
public object GetService(Type serviceType)
{
object obj;
if (factories.TryGetValue(serviceType.AssemblyQualifiedName, out obj))
{
Delegate deleg = (Delegate)obj;
if (deleg != null)
{
return deleg.DynamicInvoke();
}
}
else
{
IDependencyInjectionContainer container = Resolve<IDependencyInjectionContainer>();
if (container != null)
{
return container.GetService(serviceType);
}
}
return null;
}
}
public static class DI
{
static DI()
{
Current = new DependencyInjectionContainer();
RegisterCoreDependencies(Current);
}
public static IDependencyInjectionContainer Current
{
get;
private set;
}
private static void RegisterCoreDependencies(IDependencyInjectionContainer di)
{
}
}