namespace System.ServiceModel
{
- [MonoTODO]
public sealed class InstanceContext : CommunicationObject,
IExtensibleObject<InstanceContext>
{
ServiceHostBase host;
object implementation;
int manual_flow_limit;
- InstanceBehavior _behavior;
+ InstanceManager instance_manager;
bool is_user_instance_provider;
bool is_user_context_provider;
{
}
- public InstanceContext (ServiceHostBase host,
- object implementation) : this(host, implementation, true)
- {}
+ public InstanceContext (ServiceHostBase host, object implementation)
+ : this (host, implementation, true)
+ {
+ }
- internal InstanceContext(ServiceHostBase host,
- object implementation, bool userContextProvider)
+ internal InstanceContext (ServiceHostBase host, object implementation, bool userContextProvider)
{
this.host = host;
this.implementation = implementation;
}
internal bool IsUserProvidedContext {
- get {
- return is_user_context_provider;
- }
+ get { return is_user_context_provider; }
}
- internal InstanceBehavior Behavior {
- get {
- return _behavior;
- }
- set {
- _behavior = value;
- }
+ internal InstanceManager InstanceManager {
+ get { return instance_manager; }
+ set { instance_manager = value; }
}
protected internal override TimeSpan DefaultCloseTimeout {
public object GetServiceInstance (Message message)
{
- if (implementation == null && Behavior != null) {
- implementation = Behavior.GetServiceInstance (this, message, ref is_user_instance_provider);
+ if (implementation == null && instance_manager != null) {
+ implementation = instance_manager.GetServiceInstance (this, message, ref is_user_instance_provider);
}
return implementation;
}
- public void IncrementManualFlowControlLimit (int incrementBy)
+ public int IncrementManualFlowControlLimit (int incrementBy)
{
throw new NotImplementedException ();
}
internal void CloseIfIdle () {
- if (Behavior.InstanceContextProvider != null && !IsUserProvidedContext) {
- if (!Behavior.InstanceContextProvider.IsIdle (this)) {
- Behavior.InstanceContextProvider.NotifyIdle (IdleCallback, this);
+ if (instance_manager.InstanceContextProvider != null && !IsUserProvidedContext) {
+ if (!instance_manager.InstanceContextProvider.IsIdle (this)) {
+ instance_manager.InstanceContextProvider.NotifyIdle (IdleCallback, this);
}
else {
if (State != CommunicationState.Closed)
}
public void ReleaseServiceInstance ()
- {
- Behavior.ReleaseServiceInstance (this, implementation);
+ {
+ instance_manager.ReleaseServiceInstance (this, implementation);
+ // FIXME: should Dispose() be invoked here?
implementation = null;
}
+ void DisposeInstance ()
+ {
+ var disp = implementation as IDisposable;
+ if (disp != null)
+ disp.Dispose ();
+ }
+
protected override void OnAbort ()
{
+ DisposeInstance ();
+ }
+
+ protected override void OnFaulted ()
+ {
+ DisposeInstance ();
+ base.OnFaulted ();
}
protected override void OnClosed ()
{
+ DisposeInstance ();
base.OnClosed ();
}
+ [MonoTODO]
protected override void OnOpened ()
{
+ base.OnOpened ();
}
- protected override void OnOpening () {
- if (Behavior != null)
- Behavior.Initialize (this);
+ protected override void OnOpening ()
+ {
base.OnOpening ();
+ if (instance_manager != null)
+ instance_manager.Initialize (this);
}
+ Action<TimeSpan> open_delegate, close_delegate;
+
protected override IAsyncResult OnBeginOpen (
TimeSpan timeout, AsyncCallback callback, object state)
{
- throw new NotImplementedException ();
+ if (open_delegate == null)
+ open_delegate = new Action<TimeSpan> (OnOpen);
+ return open_delegate.BeginInvoke (timeout, callback, state);
}
protected override void OnEndOpen (IAsyncResult result)
{
+ open_delegate.EndInvoke (result);
}
protected override void OnOpen (TimeSpan timeout)
protected override IAsyncResult OnBeginClose (
TimeSpan timeout, AsyncCallback callback, object state)
{
- throw new NotImplementedException ();
+ if (close_delegate == null)
+ close_delegate = new Action<TimeSpan> (OnClose);
+ return close_delegate.BeginInvoke (timeout, callback, state);
}
protected override void OnEndClose (IAsyncResult result)
{
+ close_delegate.EndInvoke (result);
}
protected override void OnClose (TimeSpan timeout)
{
- }
+ }
}
}