/// <summary> /// Initializes a new instance of the <see cref="DomainServiceHost"/> class with /// the type of service and its base addresses specified. /// </summary> /// <param name="domainServiceType">The type of the <see cref="DomainService"/> to host.</param> /// <param name="baseAddresses"> /// An array of type <see cref="System.Uri"/> that contains the base addresses for /// the hosted service. /// </param> public DomainServiceHost(Type domainServiceType, params Uri[] baseAddresses) { if (domainServiceType == null) { throw new ArgumentNullException("domainServiceType"); } if (baseAddresses == null) { throw new ArgumentNullException("baseAddresses"); } EnableClientAccessAttribute att = (EnableClientAccessAttribute)TypeDescriptor.GetAttributes(domainServiceType)[typeof(EnableClientAccessAttribute)]; // Filter out all non-HTTP addresses. HashSet <string> allowedSchemes = DomainServiceHost._allowedSchemes; // Additionally filter out HTTP addresses if this DomainService requires a secure endpoint. if (att != null && att.RequiresSecureEndpoint) { allowedSchemes = DomainServiceHost._allowedSecureSchemes; } // Apply the filter. baseAddresses = baseAddresses.Where(addr => allowedSchemes.Contains(addr.Scheme)).ToArray(); this._domainServiceDescription = DomainServiceDescription.GetDescription(domainServiceType); this.InitializeDescription(domainServiceType, new UriSchemeKeyedCollection(baseAddresses)); }
private void GenerateConstructors(CodeTypeDeclaration proxyClass, CodeTypeDeclaration contractInterface, EnableClientAccessAttribute enableClientAccessAttribute, CodeMethodInvokeExpression onCreatedExpression) { CodeTypeReference uriTypeRef = CodeGenUtilities.GetTypeReference(typeof(Uri), this.ClientProxyGenerator, proxyClass); CodeTypeReference uriKindTypeRef = CodeGenUtilities.GetTypeReference(typeof(UriKind), this.ClientProxyGenerator, proxyClass); string containingNamespace = proxyClass.UserData["Namespace"] as string; CodeTypeReference contractTypeParameter = CodeGenUtilities.GetTypeReference( containingNamespace + "." + proxyClass.Name + "." + contractInterface.Name, containingNamespace, true); // construct relative URI string relativeServiceUri = string.Format(CultureInfo.InvariantCulture, "{0}.svc", this._domainServiceDescription.DomainServiceType.FullName.Replace('.', '-')); CodeExpression relativeUriExpression = new CodeObjectCreateExpression( uriTypeRef, new CodePrimitiveExpression(relativeServiceUri), new CodePropertyReferenceExpression(new CodeTypeReferenceExpression(uriKindTypeRef), "Relative")); // ---------------------------------------------------------------- // Default ctor decl (using relative URI) // ---------------------------------------------------------------- // ctor parameters List<CodeParameterDeclarationExpression> ctorParams = null; // base params List<CodeExpression> baseParams = new List<CodeExpression>(1); baseParams.Add(relativeUriExpression); // add <summary> doc comments string comment = string.Format(CultureInfo.CurrentCulture, Resource.CodeGen_Default_Constructor_Summary_Comments, proxyClass.Name); CodeCommentStatementCollection comments = CodeGenUtilities.GenerateSummaryCodeComment(comment, this.ClientProxyGenerator.IsCSharp); // <comments>...</comments> // public .ctor() : this(new Uri("Foo-Bar.svc", UriKind.Relative)) GenerateConstructor(proxyClass, ctorParams, baseParams, comments, false); // ---------------------------------------------------------------- // DomainContext(System.Uri serviceUri) ctor decl // ---------------------------------------------------------------- // ctor params ctorParams = new List<CodeParameterDeclarationExpression>(1); ctorParams.Add(new CodeParameterDeclarationExpression(uriTypeRef, "serviceUri")); // add <summary> and <param> comments comments = CodeGenUtilities.GenerateSummaryCodeComment(string.Format(CultureInfo.CurrentCulture, Resource.EntityCodeGen_ConstructorComments_Summary_ServiceUri, proxyClass.Name), this.ClientProxyGenerator.IsCSharp); comments.AddRange(CodeGenUtilities.GenerateParamCodeComment("serviceUri", string.Format(CultureInfo.CurrentCulture, Resource.EntityCodeGen_ConstructorComments_Param_ServiceUri, this._domainServiceDescription.DomainServiceType.Name), this.ClientProxyGenerator.IsCSharp)); // <comments>...</comments> // public .ctor(Uri serviceUri) : this(DomainContext.CreateDomainClient(typeof(TContract), serviceUri, true/false)) // ctor base parameters baseParams = new List<CodeExpression>(1); CodeTypeReference domainContextRef = CodeGenUtilities.GetTypeReference(TypeConstants.DomainContextTypeFullName, proxyClass.UserData["Namespace"] as string, false); baseParams.Add( new CodeMethodInvokeExpression( new CodeMethodReferenceExpression(new CodeTypeReferenceExpression(domainContextRef), "CreateDomainClient"), new CodeTypeOfExpression(contractTypeParameter), new CodeArgumentReferenceExpression("serviceUri"), new CodePrimitiveExpression(enableClientAccessAttribute.RequiresSecureEndpoint))); GenerateConstructor(proxyClass, ctorParams, baseParams, comments, false); // ----------------------------------------------------------------------- // DomainContext(DomainClient domainClient) ctor decl // ----------------------------------------------------------------------- // ctor parameters --[(DomainClient domainClient)] ctorParams = new List<CodeParameterDeclarationExpression>(1); ctorParams.Add(new CodeParameterDeclarationExpression(CodeGenUtilities.GetTypeReference(TypeConstants.DomainClientTypeFullName, proxyClass.UserData["Namespace"] as string, false), "domainClient")); // parameters to invoke on base -- [: base(domainClient)] baseParams = new List<CodeExpression>(1); baseParams.Add(new CodeArgumentReferenceExpression("domainClient")); // add <summary> and <param> comments comments = CodeGenUtilities.GenerateSummaryCodeComment(string.Format(CultureInfo.CurrentCulture, Resource.EntityCodeGen_ConstructorComments_Summary_DomainClientAccumulating, proxyClass.Name), this.ClientProxyGenerator.IsCSharp); comments.AddRange(CodeGenUtilities.GenerateParamCodeComment("domainClient", string.Format(CultureInfo.CurrentCulture, Resource.EntityCodeGen_ConstructorComments_Param_DomainClient), this.ClientProxyGenerator.IsCSharp)); // <comments>...</comments> // public .ctor(DomainClient domainClient) : base(domainClient)] CodeConstructor proxyCtor = GenerateConstructor(proxyClass, ctorParams, baseParams, comments, true); proxyCtor.Statements.Add(onCreatedExpression); }