Nous évaluons les conteneurs IoC pour les projets C#, et Unity et Castle.Windsor se démarquent. Une chose que j'aime à propos de Unity (NInject et StructureMap aussi) est que les types où il est évident de savoir comment les construire ne doivent pas être enregistrés avec le conteneur IoC.Can Castle.Windsor fait la résolution automatique des types de béton
Y a-t-il un moyen de le faire dans Castle.Windsor? Suis-je juste à Castle.Windsor de dire que ça ne fait pas ça? Y a-t-il une raison de conception de délibérément ne pas le faire, ou est-ce un oubli, ou tout simplement pas vu comme important ou utile?
Je connais le container.Register(AllTypes...
à Windsor, mais ce n'est pas tout à fait la même chose. Ce n'est pas entièrement automatique, et c'est très large. Pour illustrer le point, voici deux tests NUnit qui font la même chose via Unity et Castle.Windsor. Le château. Un échec échoue. :
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());
}
}
}
duplication possible de [Résoudre des classes sans les enregistrer en utilisant Castle Windsor] (http://stackoverflow.com/questions/447193/resolving-classes-without-registering-them-using-castle-windsor) – skolima