Estamos evaluando contenedores IoC para proyectos C#, y tanto Unity como Castle.Windsor se destacan. Una cosa que me gusta de Unity (NInject y StructureMap también lo hacen) es que los tipos en los que es obvio cómo construirlos no tienen que registrarse en el IoC Container.Can Castle.Windsor hacer la resolución automática de los tipos de hormigón
¿Hay alguna manera de hacer esto en Castle.Windsor? ¿Estoy siendo justo con Castle.Windsor para decir que no hace esto? ¿Hay una razón de diseño para deliberadamente no hacer esto, o es un descuido, o simplemente no se considera importante o útil?
Soy consciente de container.Register(AllTypes...
en Windsor, pero eso no es exactamente lo mismo. No es completamente automático, y es muy amplio.
Para ilustrar el punto, aquí hay dos pruebas de NUnit que hacen lo mismo a través de Unity y Castle.Windsor. El Castle.Windsor falla. :
namespace SimpleIocDemo
{
using NUnit.Framework;
using Castle.Windsor;
using Microsoft.Practices.Unity;
public interface ISomeService
{
string DoSomething();
}
public class ServiceImplementation : ISomeService
{
public string DoSomething()
{
return "Hello";
}
}
public class RootObject
{
public ISomeService SomeService { get; private set; }
public RootObject(ISomeService service)
{
SomeService = service;
}
}
[TestFixture]
public class IocTests
{
[Test]
public void UnityResolveTest()
{
UnityContainer container = new UnityContainer();
container.RegisterType<ISomeService, ServiceImplementation>();
// Root object needs no registration in Unity
RootObject rootObject = container.Resolve<RootObject>();
Assert.AreEqual("Hello", rootObject.SomeService.DoSomething());
}
[Test]
public void WindsorResolveTest()
{
WindsorContainer container = new WindsorContainer();
container.AddComponent<ISomeService, ServiceImplementation>();
// fails with exception "Castle.MicroKernel.ComponentNotFoundException:
// No component for supporting the service SimpleIocDemo.RootObject was found"
// I could add
// container.AddComponent<RootObject>();
// but that approach does not scale
RootObject rootObject = container.Resolve<RootObject>();
Assert.AreEqual("Hello", rootObject.SomeService.DoSomething());
}
}
}
posible duplicado de [Resolviendo clases sin registrarlas usando Castle Windsor] (http://stackoverflow.com/questions/447193/resolving-classes-without-registering-them-using-castle-windsor) – skolima