using System; using System.Collections.Generic; namespace IocContainer { public class Program { public static void Main() { var containerBuilder = new ContainerBuilder(); containerBuilder.For().Use(); var container = containerBuilder .Build(); var logger = container.Resolve(); logger.Log(); } } public class Container { public Dictionary serviceRegistration; public Container() { serviceRegistration = new Dictionary(); } public T Resolve() { if(serviceRegistration.ContainsKey(typeof(T))) { var implementation = serviceRegistration[typeof(T)]; return (T) Activator.CreateInstance(implementation); } else { throw new InvalidOperationException("${typeof(T).Name} service is not registered to the container"); } } } public class ContainerBuilder { private Container _container; private Type serviceType; public ContainerBuilder() { _container = new Container(); } public ContainerBuilder For() { serviceType = typeof(T); return this; } public ContainerBuilder Use() { _container.serviceRegistration.Add(serviceType, typeof(T)); return this; } public Container Build() { return _container; } } public interface ILogger { void Log(); } public class SQLServerLogger : ILogger { public void Log() { Console.WriteLine("SQL Server logging..."); } } public class FileLogger : ILogger { public void Log() { Console.WriteLine("File Logging..."); } } }