WIP towards non-generic binding methods (needed for open generics)

This commit is contained in:
Antony Male 2014-02-11 08:30:31 +00:00
parent 61df17de3e
commit c774f0291d
1 changed files with 18 additions and 14 deletions

View File

@ -10,8 +10,11 @@ namespace Stylet
{ {
public interface IKernel public interface IKernel
{ {
IStyletIoCBindTo<TService> Bind<TService>(); IStyletIoCBindTo Bind<TService>();
IStyletIoCBindTo<TService> BindSingleton<TService>(); IStyletIoCBindTo Bind(Type serviceType);
IStyletIoCBindTo BindSingleton<TService>();
IStyletIoCBindTo BindSingleton(Type serviceType);
void Compile(); void Compile();
object Get(Type type, string key = null); object Get(Type type, string key = null);
T Get<T>(string key = null); T Get<T>(string key = null);
@ -19,10 +22,11 @@ namespace Stylet
IEnumerable<T> GetAll<T>(string key = null); IEnumerable<T> GetAll<T>(string key = null);
} }
public interface IStyletIoCBindTo<TService> public interface IStyletIoCBindTo
{ {
void ToSelf(string key = null); void ToSelf(string key = null);
void To<TImplementation>(string key = null) where TImplementation : class; void To<TImplementation>(string key = null) where TImplementation : class;
void To(Type implementationType, string key = null);
void ToFactory<TImplementation>(Func<IKernel, TImplementation> factory) where TImplementation : class; void ToFactory<TImplementation>(Func<IKernel, TImplementation> factory) where TImplementation : class;
void ToFactory<TImplementation>(string key, Func<IKernel, TImplementation> factory) where TImplementation : class; void ToFactory<TImplementation>(string key, Func<IKernel, TImplementation> factory) where TImplementation : class;
} }
@ -43,13 +47,13 @@ namespace Stylet
this.AddRegistration(cls, new TransientRegistration(new TypeCreator(cls)) { WasAutoCreated = true }); this.AddRegistration(cls, new TransientRegistration(new TypeCreator(cls)) { WasAutoCreated = true });
} }
public IStyletIoCBindTo<TService> Bind<TService>() public IStyletIoCBindTo Bind<TService>()
{ {
this.CheckCompilationStarted(); this.CheckCompilationStarted();
return new BindTo<TService>(this, false); return new BindTo<TService>(this, false);
} }
public IStyletIoCBindTo<TService> BindSingleton<TService>() public IStyletIoCBindTo BindSingleton<TService>()
{ {
this.CheckCompilationStarted(); this.CheckCompilationStarted();
return new BindTo<TService>(this, true); return new BindTo<TService>(this, true);
@ -211,20 +215,22 @@ namespace Stylet
#region BindTo #region BindTo
private class BindTo<TService> : IStyletIoCBindTo<TService> private class BindTo : IStyletIoCBindTo
{ {
private StyletIoC service; private StyletIoC service;
private Type serviceType;
private bool isSingleton; private bool isSingleton;
public BindTo(StyletIoC service, bool isSingleton) public BindTo(StyletIoC service, Type serviceType, bool isSingleton)
{ {
this.service = service; this.service = service;
this.serviceType = serviceType;
this.isSingleton = isSingleton; this.isSingleton = isSingleton;
} }
public void ToSelf(string key = null) public void ToSelf(string key = null)
{ {
Type implementationType = typeof(TService); Type implementationType = this.serviceType;
this.EnsureType(implementationType); this.EnsureType(implementationType);
this.Add<TService>(new TypeCreator(implementationType, key)); this.Add<TService>(new TypeCreator(implementationType, key));
} }
@ -250,16 +256,14 @@ namespace Stylet
private void EnsureType(Type implementationType) private void EnsureType(Type implementationType)
{ {
Type serviceType = typeof(TService); if (!this.serviceType.IsAssignableFrom(implementationType))
if (!serviceType.IsAssignableFrom(implementationType)) throw new StyletIoCException(String.Format("Type {0} does not implement service {1}", implementationType.Name, this.serviceType.Name));
throw new StyletIoCException(String.Format("Type {0} does not implement service {1}", implementationType.Name, serviceType.Name));
if (!implementationType.IsClass) if (!implementationType.IsClass)
throw new StyletIoCException(String.Format("Type {0} is not a class, and so can't be used to implemented service {1}", implementationType.Name, serviceType.Name)); throw new StyletIoCException(String.Format("Type {0} is not a class, and so can't be used to implemented service {1}", implementationType.Name, this.serviceType.Name));
} }
private void Add<TImplementation>(ICreator creator) private void Add<TImplementation>(ICreator creator)
{ {
Type serviceType = typeof(TService);
Type implementationType = typeof(TImplementation); Type implementationType = typeof(TImplementation);
IRegistration registration; IRegistration registration;
@ -268,7 +272,7 @@ namespace Stylet
else else
registration = new TransientRegistration(creator); registration = new TransientRegistration(creator);
service.AddRegistration(serviceType, registration); service.AddRegistration(this.serviceType, registration);
} }
} }