protected override System.ServiceModel.Description.ServiceDescription CreateDescription(out IDictionary <string, ContractDescription> implementedContracts)
{
System.ServiceModel.Description.ServiceDescription service;
if (this.serviceType == null)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(System.ServiceModel.SR.GetString("SFxServiceHostCannotCreateDescriptionWithoutServiceType")));
}
if (this.SingletonInstance != null)
{
service = System.ServiceModel.Description.ServiceDescription.GetService(this.SingletonInstance);
}
else
{
service = System.ServiceModel.Description.ServiceDescription.GetService(this.serviceType);
}
ServiceBehaviorAttribute attribute = service.Behaviors.Find <ServiceBehaviorAttribute>();
object wellKnownSingleton = attribute.GetWellKnownSingleton();
if (wellKnownSingleton == null)
{
wellKnownSingleton = attribute.GetHiddenSingleton();
this.disposableInstance = wellKnownSingleton as IDisposable;
}
if ((typeof(IServiceBehavior).IsAssignableFrom(this.serviceType) || typeof(IContractBehavior).IsAssignableFrom(this.serviceType)) && (wellKnownSingleton == null))
{
wellKnownSingleton = System.ServiceModel.Description.ServiceDescription.CreateImplementation(this.serviceType);
this.disposableInstance = wellKnownSingleton as IDisposable;
}
if ((this.SingletonInstance == null) && (wellKnownSingleton is IServiceBehavior))
{
service.Behaviors.Add((IServiceBehavior)wellKnownSingleton);
}
ReflectedContractCollection contracts = new ReflectedContractCollection();
List <System.Type> interfaces = ServiceReflector.GetInterfaces(this.serviceType);
for (int i = 0; i < interfaces.Count; i++)
{
System.Type key = interfaces[i];
if (!contracts.Contains(key))
{
ContractDescription item = null;
if (wellKnownSingleton != null)
{
item = ContractDescription.GetContract(key, wellKnownSingleton);
}
else
{
item = ContractDescription.GetContract(key, this.serviceType);
}
contracts.Add(item);
Collection <ContractDescription> inheritedContracts = item.GetInheritedContracts();
for (int j = 0; j < inheritedContracts.Count; j++)
{
ContractDescription description3 = inheritedContracts[j];
if (!contracts.Contains(description3.ContractType))
{
contracts.Add(description3);
}
}
}
}
this.reflectedContracts = contracts;
implementedContracts = contracts.ToImplementedContracts();
return(service);
}