C# projeleri için IoC kapsayıcılarını değerlendiriyoruz ve hem Unity hem de Castle.Windsor dışarıda. Birlikten hoşlandığım bir şey (NInject ve StructureMap da bunu yapıyor), onları nasıl inşa edebileceklerinin IoC Container'a kayıtlı olması gerekmediği. Can Castle.Windsor, beton türlerinin otomatik çözünürlüğünü yapabilir
Castle.Windsor bunu yapmanın bir yolu var mı? Castle.Windsor'a, bunu yapmadığını söylemek adil mi? Bunu kasıtlı olarak yapmamanın bir tasarım sebebi var mı, yoksa bir gözetim mi, yoksa önemli ya da faydalı olarak görülmemiş mi?Windsor'ta container.Register(AllTypes...
'un farkındayım, ancak bu tamamen aynı şey değil. Tamamen otomatik değil ve çok geniştir.
Noktayı göstermek için, burada Unity ve Castle.Windsor ile aynı şeyi yapan iki NUnit testi vardır. Castle.Windsor biri başarısız olur. :
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());
}
}
}
Mümkün olan bir kopyasını [Castle Windsor kullanarak kaydetmeden sınıfları çözme] (http://stackoverflow.com/questions/447193/resolving-classes-without-registering-them-using-castle-windsor) – skolima