6

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()); 
     } 
    } 
} 
+0

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

cevap

5

Windsor, kutunun dışında bunu desteklemiyor ve bu kasıtlı bir karardır. Bununla birlikte, gövde sürümü, istenildiği gibi kayıtlı olmayan bileşenleri rahatça kaydederek bu senaryoyu desteklemek için gerçekten kolayca genişletilebilir. 5 satırlık kod gibi kullanılacak ILazyComponentLoader arabirimini uygulamanız gerekecek. Örnek için here'a bakın.

+1

kararın arkasında düşünmek? Faydası var gibi görünüyor, bu yüzden daha büyük maliyetler görmüş olmalısınız. Gizli kayıtların geçici bir yaşam tarzına sahip olacağını, ancak bu varsayımın sadece bir varsayım olacağını ve kafa karışıklığına açık olduğunu varsayabilirim. – Anthony

İlgili konular