OK, thanks for your help! -----Original Message----- From: [email protected] [mailto:[email protected]] On Behalf Of Krzysztof Kozmic Sent: den 27 augusti 2010 08:55 To: [email protected] Subject: Re: Generate proxy for transactions and also through e.g. factory method?
Windsor 2.5 lets you do this. On 27/08/2010 4:54 PM, Henrik Feldt wrote: > Hi, > > In order to use the proxy generation hook. > > -----Original Message----- > From: [email protected] > [mailto:[email protected]] On Behalf Of Krzysztof Kozmic > Sent: den 27 augusti 2010 01:43 > To: [email protected] > Subject: Re: Generate proxy for transactions and also through e.g. factory > method? > > Henri why are you using factory method instead of letting Windsor > create the proxy itself? > > 2010/8/27 Henrik Feldt<[email protected]>: >> Hey, >> >> Well, the point is that I want to use constructor dependency injection > (the >> IFileAdapter is configured by the tx-facility); I'd like to use DI and > still >> be able to wrap lots of interceptors around the targets in order to do >> full-fledged AOP :). >> >> I tried this: >> (k => { >> Console.WriteLine("Generating"); >> >> var tmp = _Generator.CreateClassProxy( >> >> > typeof (TSettings), options, new object[] {c.Resolve<IFileAdapte >> r>()}, >> new AutoSave(), >> >> new GetProperties()) as TSettings; >> >> > Console.WriteLine(string.Format("Done with gen, type {0}, c'tors: {1}, dep: >> {2}", tmp.GetType(), >> >> > string.Join(",", tmp.GetType().GetConstructors().Select(ctor => ctor.ToStrin >> g()).ToArray()), tmp.Fa)); >> return tmp; >> } >> >> Which gives output: >> Generating >> [my interceptor output from c'tor calls to properties] >> Methods inspected >> Intercepted Castle.Proxies.Invocations.PropertiesSettings_set_First >> Intercepted Castle.Proxies.Invocations.PropertiesSettings_set_Grades >> Intercepted Castle.Proxies.Invocations.PropertiesSettings_set_Items >> Intercepted Castle.Proxies.Invocations.PropertiesSettings_set_Grades >> Done with gen, type Castle.Proxies.PropertiesSettingsProxy, c'tors: Void >> .ctor(Castle.Core.Interceptor.IInterceptor[], >> Castle.Services.Transaction.IO.IFileAdapter), dep: >> Castle.Services.Transaction.IO.FileAdapter >> Test 'ProxyTests.CreatingSettings' failed: >> Castle.MicroKernel.ComponentActivator.ComponentActivatorException : >> FactoryActivator: could not proxy Castle.Proxies.PropertiesSettingsProxy >> ----> System.ArgumentException : Can not instantiate proxy of class: >> PropertiesSettings. >> Could not find a parameterless constructor. >> Parameter name: constructorArguments >> at Castle.Facilities.FactorySupport.FactoryActivator.Create(Object >> factoryInstance, String factoryId, MethodInfo instanceCreateMethod, String >> factoryCreate, CreationContext context) >> at >> > Castle.Facilities.FactorySupport.FactoryActivator.Instantiate(CreationContex >> t context) >> >> HOWEVER: >> ======== >> >> Registering the interceptors as well and not using the proxy generator > works >> fine. Then the question is merely how to specify a generation hook for it? >> Or alternatively how to mimic the default behavior... >> >> Cheers, >> Henrik >> >> From: [email protected] >> [mailto:[email protected]] On Behalf Of John Simons >> Sent: den 27 augusti 2010 00:14 >> To: [email protected] >> Subject: Re: Generate proxy for transactions and also through e.g. factory >> method? >> >> I'm sure it can't be this easy, but have you tried to do what the > exception >> tells you? >> Add a default public constructor to PropertiesSettings class. >> >> Cheers >> John >> >> ________________________________________ >> From: Henrik Feldt<[email protected]> >> To: [email protected] >> Sent: Fri, 27 August, 2010 6:48:49 AM >> Subject: Generate proxy for transactions and also through e.g. factory >> method? >> >> Hi, >> >> I'm trying to extend a transactional class to create a nifty >> properties-class that auto-saves, keeps key-values updated and is >> transactional. My final aim being to create a bunch of test-cases for >> transaction failure handling and retry-policies. >> >> I got code like this: >> >> private static readonly ProxyGenerator _Generator = new ProxyGenerator(); >> >> public static IWindsorContainer CreateContainer<TSettings>() where > TSettings >> : SettingsBase >> { >> var c = new WindsorContainer(); >> c.AddFacility<FactorySupportFacility>(); >> c.AddFacility<TransactionFacility>(); >> >> var options = new ProxyGenerationOptions(new >> SettingsProxyGenerationHook()); >> >> c.Register( >> >> > Component.For<ITransactionManager>().ImplementedBy<DefaultTransactionManager >>> (), >> Component.For<TSettings>() >> .UsingFactoryMethod(k => >> _Generator.CreateClassProxy( >> typeof(TSettings), options, new >> object[] { c.Resolve<IFileAdapter>() }, >> new AutoSave(), >> new GetProperties()) as TSettings) >> .LifeStyle.Transient >> ); >> >> return c; >> } >> >> public static TSettings CreateSettings<TSettings>() where TSettings : >> SettingsBase >> { >> var s = CreateContainer<TSettings>().Resolve<TSettings>(); >> return s; >> } >> >> [Test] >> public void CreatingSettings() >> { >> CreateSettings<PropertiesSettings>(); >> } >> >> Which yields this exception: >> >> Test 'ProxyTests.CreatingSettings' failed: >> Castle.MicroKernel.ComponentActivator.ComponentActivatorException : >> FactoryActivator: could not proxy Castle.Proxies.PropertiesSettingsProxy >> ----> System.ArgumentException : Can not instantiate proxy of class: >> PropertiesSettings. >> Could not find a parameterless constructor. >> Parameter name: constructorArguments >> at Castle.Facilities.FactorySupport.FactoryActivator.Create(Object >> factoryInstance, String factoryId, MethodInfo instanceCreateMethod, String >> factoryCreate, CreationContext context) >> at >> > Castle.Facilities.FactorySupport.FactoryActivator.Instantiate(CreationContex >> t context) >> at >> > Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.InternalCrea >> te(CreationContext context) >> at >> > Castle.MicroKernel.ComponentActivator.AbstractComponentActivator.Create(Crea >> tionContext context) >> at >> > Castle.MicroKernel.Lifestyle.AbstractLifestyleManager.Resolve(CreationContex >> t context) >> at >> Castle.MicroKernel.Handlers.DefaultHandler.ResolveCore(CreationContext >> context, Boolean track) >> at >> Castle.MicroKernel.Handlers.AbstractHandler.Resolve(CreationContext > context) >> at Castle.MicroKernel.DefaultKernel.ResolveComponent(IHandler >> handler, Type service, IDictionary additionalArguments) >> at Castle.MicroKernel.DefaultKernel.ResolveComponent(IHandler >> handler, Type service) >> at Castle.MicroKernel.DefaultKernel.get_Item(Type service) >> at Castle.Windsor.WindsorContainer.Resolve(Type service) >> at Castle.Windsor.WindsorContainer.Resolve[T]() >> SettingsBaseTests.cs(52,0): at >> ProxyTests.CreateSettings[TSettings]() >> SettingsBaseTests.cs(59,0): at ProxyTests.CreatingSettings() >> >> >> What is the best way to go about fixing this? Is there a way to specify a >> generation hook through the fluent registration api, so that I don't have > to >> use a factory method? What am I missing? >> >> SettingsBase, that abstract base class for PropertiesSettings (I had a >> bright moment naming that one!), has the TransactionalAttribute attached. >> >> Cheers >> >> -- >> You received this message because you are subscribed to the Google Groups >> "Castle Project Users" group. >> To post to this group, send email to > [email protected]. >> To unsubscribe from this group, send email to >> [email protected]. >> For more options, visit this group at >> http://groups.google.com/group/castle-project-users?hl=en. >> >> >> -- >> You received this message because you are subscribed to the Google Groups >> "Castle Project Users" group. >> To post to this group, send email to > [email protected]. >> To unsubscribe from this group, send email to >> [email protected]. >> For more options, visit this group at >> http://groups.google.com/group/castle-project-users?hl=en. >> >> -- >> You received this message because you are subscribed to the Google Groups > "Castle Project Users" group. >> To post to this group, send email to > [email protected]. >> To unsubscribe from this group, send email to > [email protected]. >> For more options, visit this group at > http://groups.google.com/group/castle-project-users?hl=en. >> -- You received this message because you are subscribed to the Google Groups "Castle Project Users" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/castle-project-users?hl=en. -- You received this message because you are subscribed to the Google Groups "Castle Project Users" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/castle-project-users?hl=en.
