class Program
{
 static void Main(string[] args){
  Resolver resolver = new Resolver();
  resolver.Register<Shopper, Shopper>();
  resolver.Register<ICreditCard, MasterCard>();
  var shoper = resolver.Resolve<Shopper>();
  shopper.Charge();
  Console.Read();
 }
}
public class Resolver
{
 private Dictionary<Type, Type> dependencyMap = new Dictionary<Type, Type>();
 public T Resolve<T>()
 {
  return (T)Resolve(typeof(T));
  private object Resolve(Type typeToResolve)
  {
   Type resolvedType = null;
   try{
    resolvedType = dependencyMap[typeToResolve];
   }
   catch
   {
    throw new Exception(string.Format("Could not resolve type {0}", typeToResolve.FullName));
   }
 
   var firstConstructor = resolvedType.GetConstructors().First();
   var constructorParameters = firstConstructor.GetParameters();
   if(constructorParameters.Count() == 0)
    return Activator.CreateInstance(resolvedType);
  
   IList<object> parameters = new List<object>();
   foreach(var parameterToResolve in constructorParameters)
   {
    parameters.Add(Resolve(parameterToResolve.ParameterType);
   }
 
   return firstConstructor.Invoke(parameters.ToArray());
  }
  public void Register<TFrom, TTo>()
  {
   dependencyMap.Add(typeof(TFrom), typeof(TTo));
  }
 }
 public class Visa : ICreditCard
 {
  public string Charge()
  {
   return "Charging with the Visa!";
  }
 }
 public class MasterCard : ICreditCard
 {
  public string Charge()
  {
   return "Charging with the MasterCard!";
  }
 }
 public interface ICreditCard
 {
  string Charge();
 }
}
Reference: Pluralsight course on Inversion of Control by John Sonmez
No comments:
Post a Comment