no worries mate,

cheers

On 27/08/2010 5:31 PM, Henrik Feldt wrote:
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.

Reply via email to