//------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //------------------------------------------------------------ namespace System.ServiceModel.Dispatcher { using System.ServiceModel.Channels; class DurableInstanceProvider : IInstanceProvider { DurableInstanceContextProvider durableInstanceContextProvider; public DurableInstanceProvider(DurableInstanceContextProvider instanceContextProvider) { this.durableInstanceContextProvider = instanceContextProvider; } public object GetInstance(InstanceContext instanceContext) { return ((IInstanceProvider) this).GetInstance(instanceContext, null); } public object GetInstance(InstanceContext instanceContext, Message message) { if (instanceContext == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("instanceContext"); } return instanceContext.Extensions.Find(); } public virtual void ReleaseInstance(InstanceContext instanceContext, object instance) { if (instanceContext == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("instanceContext"); } if (instance == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("instance"); } DurableInstance durableInstance = (DurableInstance) instance; if (instanceContext.State == CommunicationState.Faulted || instanceContext.Aborted) { durableInstance.Abort(); this.durableInstanceContextProvider.UnbindAbortedInstance(instanceContext, durableInstance.InstanceId); } else if (instanceContext.State == CommunicationState.Closed) { durableInstance.Close(); } } } }