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)?
:
Ben Ayrıca, alakalı gibiydi bu github sorunu buldum. – AmyBu 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
@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