2013-03-20 18 views
5

Bunun neden çalışmadığını açıklayan herkes var mı? Eğer önleyiciyi IFoo'nun kaydından kaldırır ve bir Çubuğu çözerseniz, bir Foo (MyFoo boş değil) alırsınız. Ancak önleyici ile Foo artık çözülmez.Windsor, yakalanan bileşenleri çözümlemiyor

Neden? Günlüğe kaydetme veya izleme yoluyla neden çözümlenmeyeceğini nasıl anlarım?

sürümleri:

  • Castle.Core: 3.2
  • Castle.Windsor: 3.2
  • NET 4,5
  • C# 5

    using Castle.DynamicProxy; 
    using Castle.MicroKernel.Registration; 
    using Castle.Windsor; 
    using System; 
    
    namespace Sandbox 
    { 
    public interface IFooInterceptor : IInterceptor { } 
    
    public interface IFoo 
    { 
        void Print(); 
    } 
    
    public interface IBar 
    { 
        IFoo MyFoo { get; set; } 
    } 
    
    public class Foo : IFoo 
    { 
        public void Print() 
        { 
         Console.WriteLine("Print"); 
        } 
    } 
    
    public class FooInterceptor : IFooInterceptor, IInterceptor 
    { 
    
        public void Intercept(IInvocation invocation) 
        { 
         Console.WriteLine("Awesome"); 
         invocation.Proceed(); 
        } 
    } 
    
    public class Bar : IBar 
    { 
        public virtual IFoo MyFoo { get; set; } 
    } 
    
    class Program 
    { 
    
        static void Main(string[] args) 
        { 
         IWindsorContainer container = new WindsorContainer() 
          .Register(
           Component.For<IBar>().ImplementedBy<Bar>().LifestyleTransient(), 
           Component.For<IFoo>().ImplementedBy<Foo>().LifestyleTransient().Interceptors<IFooInterceptor>(), 
           Component.For<IFooInterceptor>().ImplementedBy<FooInterceptor>().LifestyleTransient() 
          ); 
    
         var bar = container.Resolve<IBar>(); 
         var foo = container.Resolve<IFoo>(); // this isn't null 
         bar.MyFoo.Print();     // exception: bar.MyFoo is null 
         Console.WriteLine("Done"); 
         Console.ReadLine(); 
        } 
    
    } 
    } 
    

Düzenleme: Bir interkom yapılandırmasını bir arabirimden somut bir sınıfa dönüştüren (çoğunlukla kaza ile) buldum. Ancak, önleyiciyi ve arayüzünü kaydediyorum, bu yüzden asıl soru biraz değiştiriliyor: arayüz belirtimi neden başarısız oluyor (sessizce, daha az değil)?

+1

:

Ben Ayrıca, alakalı gibiydi bu github sorunu buldum. – Amy

+1

Bu bir böcek gibi görünüyor. Propriyeler isteğe bağlı bağımlılıklardır, ancak bunlar varsayılan olarak doldurulmalı, ancak bir şekilde kesişme ile çatışmalıdır. Bağımlılığınızı 'Component.For () .ImplementedBy () .LifestyleTransient() ile zorunlu kılarsanız, Properties (PropertyFilter.RequireAll) 'da çalışır. Bu sorunu github'da buldum: https://github.com/castleproject/Windsor/issues/24 bununla ilgili hissediyor. – nemesv

+0

@nemesv Bence bunu cevap olarak gönderebilirsiniz, böylece soru cevapsız kalmayacak. Bar.MyFoo'nun yapıcı argümanı olarak sunulması da sorunu çözecektir. – Marwijn

cevap

2

Kale, özellikleri isteğe bağlı bağımlılıklar olarak işler ancak varsayılan olarak bunları enjekte etmelidir. Ancak Interceptors ile birleştirildiğinde bu isteğe bağlı bağımlılıkların doğru şekilde çözülmediği görülüyor.

size bağımlılıkları Bar yapıcı enjeksiyon kullanmaya değiştirerek gerekli yapmak olduğunu yapabilecekleriniz:

Component.For<IBar>().ImplementedBy<Bar>().LifestyleTransient() 
    .Properties(Prop‌​ertyFilter.RequireAll) 

Not: açıkça gerekli işaretli Properties ile Bar

public class Bar : IBar 
{ 
    public Bar(IFoo foo) 
    { 
     MyFoo = foo; 
    } 

    public virtual IFoo MyFoo { get; private set; } 
} 

Veya kaydolması Üretim Properties yerine yöntemini kullanmalısınız, çünkü artık eskimiş. Ben Dynamicproxy etiketinin kaldırılmasını kabul Bug - optional dependencies not provided