[ Log On ]

Dependency Injection - Castle Windsor

Posted by frennky on 6/12/2011 @ 3:33 PM in Web Development

Poslednji IoC kontejner u ovom serijalu je Castle Windsor. Ovaj IoC kontejner je deo Castle projekta iza koga stoji grupa iskusnih .Net developer-a.

Jednostavna implementacija IDependencyResolver interfejsa pomoću Castle Windsor IoC kontejnera bi izgledala ovako:

    public class CastleWindsorDependencyResolver : IDependencyResolver
    {
        private IKernel kernel;

        public CastleWindsorDependencyResolver(IKernel kernel)
        {
            this.kernel = kernel;
        }

        public object GetService(Type serviceType)
        {
            try
            {
                return this.kernel.Resolve(serviceType);
            }
            catch
            {
                return null;
            }
        }

        public IEnumerable<object> GetServices(Type serviceType)
        {
            try
            {
                return this.kernel.ResolveAll(serviceType).Cast<IEnumerable<object>>();
            }
            catch
            {
                return new List<object>();
            }
        }
    }

Na kraju, konfigurisanje Castle Windsor IoC kontejnera treba izvršiti unutar Global.asax.cs fajla:

    protected void Application_Start()
    {
		RegisterCastleWindsorDependencyResolver();
		RegisterGlobalFilters(GlobalFilters.Filters);
		RegisterRoutes(RouteTable.Routes);
	}

    private void RegisterCastleWindsorDependencyResolver()
    {
        var container = new WindsorContainer()
            .Register(Component.For<HomeController>())
            .Register(Component.For<IRepository>().ImplementedBy<ConcreteRepository>());
            
        DependencyResolver.SetResolver(
            new CastleWindsorDependencyResolver(container.Kernel));
    }