Stiamo valutando contenitori IoC per progetti C# e sia Unity sia Castle.Windsor si distinguono. Una cosa che mi piace di Unity (anche NInject e StructureMap lo fanno) sono quei tipi in cui è ovvio come costruirli non devono essere registrati con il contenitore IoC.Can Castle.Windsor esegue la risoluzione automatica dei tipi di calcestruzzo
C'è un modo per farlo in Castle.Windsor? Sono onesto con Castle.Windsor per dire che non lo fa? Esiste una ragione di progettazione per non farlo deliberatamente, o è una svista, o semplicemente non visto come importante o utile?
Sono a conoscenza di container.Register(AllTypes...
a Windsor, ma non è proprio la stessa cosa. Non è completamente automatico ed è molto ampio.
Per illustrare il punto, qui ci sono due test NUnit che fanno la stessa cosa tramite Unity e Castle.Windsor. The Castle.Windsor si fallisce. :
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());
}
}
}
possibile duplicato di [Risolvere le classi senza registrarle utilizzando Castle Windsor] (http://stackoverflow.com/questions/447193/resolving-classes-without-registering-them-using-castle-windsor) – skolima