Still no answer? On 12 Aug., 13:08, LOBOMINATOR <[email protected]> wrote: > I see that Wcf facility is not even officially released... :( > > On Aug 12, 7:55 am,LOBOMINATOR<[email protected]> wrote: > > > > > I knew that this answer will come ;) I should have written that I'm > > using ninject and not windsor :( Any thoughts without facility? > > > Daniel > > > On Aug 11, 11:42 pm, Krzysztof Ko¼mic <[email protected]> > > wrote: > > > > Wcf facility already handles that OOTB, without any need for code > > > generation. > > > > On 12/08/2010 1:43 AM,LOBOMINATORwrote: > > > > > Hello > > > > >http://wcfproxygenerator.codeplex.com/releases/view/28579 > > > > The sample has an Abstract class ExceptionHandlingProxyBase<T> which > > > > does implement logic to close and regenerate WCF proxies when an > > > > exception occurs. > > > > > [ServiceContract] > > > > public interface IFoo > > > > { > > > > [OperationContract] > > > > void Bar(); > > > > int BarWithReturn(); > > > > void BarWithParam(int yeah); > > > > } > > > > > How can I use dynamic proxy to generate a class which looks like this: > > > > > public class Proxy : ExceptionHandlingProxyBase<IFoo>, IFoo > > > > { > > > > public void Bar() { > > > > base.Invoke("Bar"); > > > > } > > > > public int Bar() { > > > > return base.Invoke("Bar"); > > > > } > > > > public void BarWithParam(int yeah) { > > > > base.Invoke("BarWithParam", yeah); > > > > } > > > > } > > > > > Here the ExceptionHandlingProxyBase > > > > > public class ExceptionHandlingProxyBase<T> : ICommunicationObject, > > > > IDisposable > > > > where T : class > > > > { > > > > // state > > > > private bool IsOpened { get; set; } > > > > public bool IsDisposed { get; private set; } > > > > > // lock > > > > private object m_channelLock = new object(); > > > > private bool m_isInitialized = false; > > > > private bool m_isProxyCreated = false; > > > > private ManualResetEvent m_proxyRecreationLock = new > > > > ManualResetEvent(true); > > > > protected int m_proxyRecreationLockWait = 1000; > > > > > // channel > > > > private ChannelFactory<T> m_channelFactory = null; > > > > private T m_channel = default(T); > > > > > #region Constructors > > > > > public ExceptionHandlingProxyBase() > > > > { > > > > } > > > > > public ExceptionHandlingProxyBase(string > > > > endpointConfigurationName) > > > > { > > > > Initialize(endpointConfigurationName); > > > > } > > > > > protected virtual void Initialize(string > > > > endpointConfigurationName) > > > > { > > > > if (this.m_isInitialized) throw new > > > > InvalidOperationException("Object already initialized."); > > > > this.m_isInitialized = true; > > > > > m_channelFactory = new > > > > ChannelFactory<T>(endpointConfigurationName); > > > > } > > > > > public ExceptionHandlingProxyBase(string > > > > endpointConfigurationName, string remoteAddress) > > > > { > > > > Initialize(endpointConfigurationName, remoteAddress); > > > > } > > > > > protected virtual void Initialize(string > > > > endpointConfigurationName, string remoteAddress) > > > > { > > > > if (this.m_isInitialized) throw new > > > > InvalidOperationException("Object already initialized."); > > > > this.m_isInitialized = true; > > > > > m_channelFactory = new > > > > ChannelFactory<T>(endpointConfigurationName, new > > > > EndpointAddress(remoteAddress)); > > > > } > > > > > public ExceptionHandlingProxyBase(Binding binding, > > > > EndpointAddress remoteAddress) > > > > { > > > > Initialize(binding, remoteAddress); > > > > } > > > > > protected virtual void Initialize(Binding binding, > > > > EndpointAddress remoteAddress) > > > > { > > > > if (this.m_isInitialized) throw new > > > > InvalidOperationException("Object already initialized."); > > > > this.m_isInitialized = true; > > > > > m_channelFactory = new ChannelFactory<T>(binding, > > > > remoteAddress); > > > > } > > > > > #endregion > > > > > #region Proxy creation > > > > > public event EventHandler AfterRecreateProxy; > > > > > protected virtual void CreateProxy() > > > > { > > > > > lock (this.m_channelLock) > > > > { > > > > if (this.m_isProxyCreated) throw new > > > > InvalidOperationException("Proxy already created."); > > > > CreateInnerChannel(); > > > > this.m_isProxyCreated = true; > > > > > } > > > > } > > > > > protected virtual void RecreateProxy() > > > > { > > > > lock (this.m_channelLock) > > > > { > > > > if (this.IsDisposed) throw new > > > > InvalidOperationException("Cannot use disposed object."); > > > > > CreateInnerChannel(); > > > > > if (AfterRecreateProxy != null) > > > > AfterRecreateProxy(this, null); > > > > } > > > > } > > > > > private void CreateInnerChannel() > > > > { > > > > lock (this.m_channelLock) > > > > { > > > > if (m_channelFactory == null) > > > > throw new InvalidOperationException("Proxy > > > > invalid. This occurs when you use the default constructor."); > > > > > m_channel = m_channelFactory.CreateChannel(); > > > > > ICommunicationObject co = m_channel as > > > > ICommunicationObject; > > > > co.Faulted += InnerChannel_Faulted; > > > > co.Closed += InnerChannel_Closed; > > > > co.Closing += InnerChannel_Closing; > > > > co.Opened += InnerChannel_Opened; > > > > co.Opening += InnerChannel_Opening; > > > > } > > > > } > > > > #endregion > > > > > #region Communication events > > > > > private void InnerChannel_Opening(object sender, EventArgs e) > > > > { > > > > lock (m_channelLock) > > > > { > > > > if (this.IsDisposed) throw new > > > > InvalidOperationException("Cannot use disposed object."); > > > > > if (this.Opening != null) > > > > this.Opening(sender, e); > > > > } > > > > } > > > > > private void InnerChannel_Opened(object sender, EventArgs e) > > > > { > > > > lock (m_channelLock) > > > > { > > > > if (this.IsDisposed) throw new > > > > InvalidOperationException("Cannot use disposed object."); > > > > > if (this.Opened != null) > > > > this.Opened(sender, e); > > > > } > > > > } > > > > > void InnerChannel_Closing(object sender, EventArgs e) > > > > { > > > > lock (m_channelLock) > > > > { > > > > if (this.IsDisposed) throw new > > > > InvalidOperationException("Cannot use disposed object."); > > > > > if (this.Closing != null) > > > > this.Closing(sender, e); > > > > } > > > > } > > > > private void InnerChannel_Closed(object sender, EventArgs e) > > > > { > > > > lock (m_channelLock) > > > > { > > > > if (this.IsDisposed) throw new > > > > InvalidOperationException("Cannot use disposed object."); > > > > > try > > > > { > > > > this.m_proxyRecreationLock.Reset(); // will stop > > > > other threads from trying to Invoke() while recreating the proxy > > > > > if (this.Closed != null) > > > > this.Closed(sender, e); > > > > > OnClosed(); > > > > } > > > > finally > > > > { > > > > this.m_proxyRecreationLock.Set(); // will stop > > > > other threads from trying to Invoke() while recreating the proxy > > > > } > > > > > } > > > > > } > > > > protected virtual void OnClosed() > > > > { > > > > lock (this.m_channelLock) > > > > { > > > > if (this.IsDisposed) throw new > > > > InvalidOperationException("Cannot use disposed object."); > > > > > this.Abort(); > > > > RecreateProxy(); > > > > > } > > > > } > > > > > private void InnerChannel_Faulted(object sender, EventArgs e) > > > > { > > > > lock (m_channelLock) > > > > { > > > > if (this.IsDisposed) throw new > > > > InvalidOperationException("Cannot use disposed object."); > > > > > try > > > > { > > > > this.m_proxyRecreationLock.Reset(); // will stop > > > > other threads from trying to Invoke() while recreating the proxy > > > > > if (this.Faulted != null) > > > > this.Faulted(sender, e); > > > > > OnFaulted(); > > > > } > > > > finally > > > > { > > > > this.m_proxyRecreationLock.Set(); // will stop > > > > other threads from trying to Invoke() while recreating the proxy > > > > } > > > > } > > > > > } > > > > protected virtual void OnFaulted() > > > > { > > > > lock (this.m_channelLock) > > > > { > > > > if (this.IsDisposed) throw new > > > > InvalidOperationException("Cannot use disposed object."); > > ... > > Erfahren Sie mehr »
-- 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.
