2015-06-19 115 views
0

我的silverlight項目引用了RIA Services Silverlight Client,我的.web應用程序可以訪問RIAServices.Server。Silverlight使用RIA服務與WCF通信Silverlight Client

我似乎無法找到一個很好的教程來了解如何連接這些。一旦我瞭解如何從我的NumberGenerator方法獲取數據。我可以從那裏撿起來。我有三個問題需要我幫忙。

首先,我正確設置這個項目?我從來沒有用RIA做過一個項目。

其次我需要使用ServiceContract(),FaultContract和OperationContract是什麼參考?大多數示例顯示它們位於System.ServiceModel庫中。在這種情況下,使用外部庫RIA Services Silverlight Client並非如此。它會拋出一個錯誤,說我缺少一個參考。還有哪些其他圖書館會有這三個圖書館?

我最後的問題是你在SystemDomainContext中使用了什麼URI?在我發現代碼的地方使用了MyFirstRIAApplication-Web-EmployeeDomainService.svc,但在我的情況下,我沒有任何具有.svc擴展名的東西。我會使用.xap還是.aspx?

這裏是我的Silverlight代碼

這裏是我的NumberGenerator Silverlight的用戶控件頁代碼

public partial class NumberGenerator : UserControl 
{ 
    public NumberGenerator() 
    { 
     InitializeComponent(); 
     GenerateNumber(); 
    } 

    private void GenerateButton_Click(object sender, RoutedEventArgs e) 
    { 
     GenerateNumber(); 
    } 

    private void GenerateNumber() 
    { 
     int result = 0 
     SystemClientServices systemclientservices = SystemClientServices.Instance; 
     result = systemclientservices.GenerateNumber(); 
     NumberLabel.Content = result; 
    } 
} 

這裏是我的系統客戶端服務類

private readonly static SystemClientServices _instance = new SystemClientServices(); 

private SystemDomainContext _domainContext = new SystemDomainContext(); 

private SystemClientServices() { } 

public static SystemClientServices Instance 
{ 
    get 
    { 
     return _instance; 
    } 
} 

public int GenerateNumber() 
{ 
    //Code goes here to get the information from the Domainservices 
    LoadOperation load = this._domainContext.Load(this._domainContext.GetNumberGeneratorQuery(), LoadBehavior.KeepCurrent, false); 
    return Convert.ToInt32(load.Entities); 
} 

這是我NumberGenerator類上的Silverlight本地項目

public sealed partial class NumberGenerator : Entity 
{ 
    private static readonly NumberGenerator _instance = new NumberGenerator(); 
    public int NumberGenerated { get; set; } 

    public NumberGenerator() 
    { 
     NumberGenerated = 0; 
    } 

    public static NumberGenerator Instance 
    { 
     get 
     { 
      return _instance; 
     } 
    } 
} 

這裏是關於Silverlight的本地項目

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.ComponentModel.DataAnnotations; 
using System.Linq; 
using System.Runtime.Serialization; 
using System.ServiceModel.DomainServices; 
using System.ServiceModel.DomainServices.Client; 
using System.ServiceModel.DomainServices.Client.ApplicationServices; 
using System.ServiceModel.Web; 
using System.ServiceModel; 
public sealed partial class SystemDomainConext : DomainContext 
{ 
    #region Extensibility Method Definitions 

    /// <summary> 
    /// This method is invoked from the constructor once initialization is complete and 
    /// can be used for further object setup. 
    /// </summary> 
    partial void OnCreated(); 

    #endregion 


    /// <summary> 
    /// Initializes a new instance of the <see cref="EmployeeDomainContext"/> class. 
    /// </summary> 
    public SystemDomainConext() : this(new WebDomainClient<ISystemDomainServiceContract>(new Uri("MyFirstRIAApplication-Web-EmployeeDomainService.svc", UriKind.Relative))) 
    { 
    } 

    /// <summary> 
    /// Initializes a new instance of the <see cref="EmployeeDomainContext"/> class with the specified service URI. 
    /// </summary> 
    /// <param name="serviceUri">The EmployeeDomainService service URI.</param> 
    public SystemDomainConext(Uri serviceUri) : this(new WebDomainClient<ISystemDomainServiceContract>(serviceUri)) 
    { 
    } 

    /// <summary> 
    /// Initializes a new instance of the <see cref="EmployeeDomainContext"/> class with the specified <paramref name="domainClient"/>. 
    /// </summary> 
    /// <param name="domainClient">The DomainClient instance to use for this DomainContext.</param> 
    public SystemDomainConext(DomainClient domainClient) : base(domainClient) 
    { 
     this.OnCreated(); 
    } 

    /// <summary> 
    /// Gets the set of <see cref="Employee"/> entity instances that have been loaded into this <see cref="EmployeeDomainContext"/> instance. 
    /// </summary> 
    public EntitySet<NumberGenerator> GeneratedNumber 
    { 
     get 
     { 
      return base.EntityContainer.GetEntitySet<NumberGenerator>(); 
     } 
    } 

    /// <summary> 
    /// Gets an EntityQuery instance that can be used to load <see cref="Employee"/> entity instances using the 'GetEmployee' query. 
    /// </summary> 
    /// <returns>An EntityQuery that can be loaded to retrieve <see cref="Employee"/> entity instances.</returns> 
    public EntityQuery<NumberGenerator> GetNumberGeneratorQuery() 
    { 
     this.ValidateMethod("GetGeneratedNumber", null); 
     return base.CreateQuery<NumberGenerator>("GetNumberGenerator", null, false, true); 
    } 

    /// <summary> 
    /// Creates a new EntityContainer for this DomainContext's EntitySets. 
    /// </summary> 
    /// <returns>A new container instance.</returns> 
    protected override EntityContainer CreateEntityContainer() 
    { 
     return new NumberGeneratorDomainContextEntityContainer(); 
    } 

    /// <summary> 
    /// Service contract for the 'EmployeeDomainService' DomainService. 
    /// </summary> 
    [ServiceContract()] 
    public interface ISystemDomainServiceContract 
    { 
     /// <summary> 
     /// Asynchronously invokes the 'GetEmployee' operation. 
     /// </summary> 
     /// <param name="callback">Callback to invoke on completion.</param> 
     /// <param name="asyncState">Optional state object.</param> 
     /// <returns>An IAsyncResult that can be used to monitor the request.</returns> 
     [FaultContract(typeof(DomainServiceFault), Action="http://tempuri.org/EmployeeDomainService/GetEmployeeDomainServiceFault", Name="DomainServiceFault", Namespace="DomainServices")] 
     [OperationContract(AsyncPattern=true, Action="http://tempuri.org/EmployeeDomainService/GetEmployee", ReplyAction="http://tempuri.org/EmployeeDomainService/GetEmployeeResponse")] 
     [WebGet()] 
     IAsyncResult GetGeneratedNumber(AsyncCallback callback, object asyncState); 

     /// <summary> 
     /// Completes the asynchronous operation begun by 'BeginGetEmployee'. 
     /// </summary> 
     /// <param name="result">The IAsyncResult returned from 'BeginGetEmployee'.</param> 
     /// <returns>The 'QueryResult' returned from the 'GetEmployee' operation.</returns> 
     QueryResult<NumberGenerator> EndGetGeneratedNumber(IAsyncResult result); 

     /// <summary> 
     /// Asynchronously invokes the 'SubmitChanges' operation. 
     /// </summary> 
     /// <param name="changeSet">The change-set to submit.</param> 
     /// <param name="callback">Callback to invoke on completion.</param> 
     /// <param name="asyncState">Optional state object.</param> 
     /// <returns>An IAsyncResult that can be used to monitor the request.</returns> 
     [FaultContract(typeof(DomainServiceFault), Action="http://tempuri.org/EmployeeDomainService/SubmitChangesDomainServiceFault", Name="DomainServiceFault", Namespace="DomainServices")] 
     [OperationContract(AsyncPattern=true, Action="http://tempuri.org/EmployeeDomainService/SubmitChanges", ReplyAction="http://tempuri.org/EmployeeDomainService/SubmitChangesResponse")] 
     IAsyncResult BeginSubmitChanges(IEnumerable<ChangeSetEntry> changeSet, AsyncCallback callback, object asyncState); 

     /// <summary> 
     /// Completes the asynchronous operation begun by 'BeginSubmitChanges'. 
     /// </summary> 
     /// <param name="result">The IAsyncResult returned from 'BeginSubmitChanges'.</param> 
     /// <returns>The collection of change-set entry elements returned from 'SubmitChanges'.</returns> 
     IEnumerable<ChangeSetEntry> EndSubmitChanges(IAsyncResult result); 
    } 

    internal sealed class NumberGeneratorDomainContextEntityContainer : EntityContainer 
    { 

     public NumberGeneratorDomainContextEntityContainer() 
     { 
      this.CreateEntitySet<NumberGenerator>(EntitySetOperations.Edit); 
     } 
    } 
} 

這裏系統域Conext類是我的系統域服務類,它是在Silverlight.web

[EnableClientAccess()] 
public class SystemDomainServices : DomainService 
{ 
    private NumberGenerator numberGenerator = NumberGenerator.Instance; 
    public int NumberGenerate() 
    { 
     return numberGenerator.NumberGenerated; 
    } 
} 

這裏是關於Silverlight的的NumberGenerator類.web

private static readonly NumberGenerator _instance = new NumberGenerator(); 
[Key] 
public int NumberGenerated { get; set; } 

public NumberGenerator() 
{ 
    NumberGenerated = GenerateNumber(); 
} 

public static NumberGenerator Instance 
{ 
    get 
    { 
     return _instance; 
    } 
} 

public int GenerateNumber() 
{ 
    string db_date = ""; 
    int db_num = 0; 
    string todaysdate = ""; 
    int temp_num = db_num; 
    int result = 0; 
    using (SqlConnection connection = new SqlConnection(DBConnectionString)) 
    { 
     connection.Open(); 
     using (SqlCommand command = new SqlCommand("SELECT * FROM table", connection)) 
     { 
      using (SqlDataReader reader = command.ExecuteReader()) 
      { 
       while (reader.Read()) 
       { 
        db_date = reader.GetString(0); 
        db_num = (int)(reader.GetSqlInt32(1)); 
        todaysdate = DateTime.Now.ToString("yMMdd"); 
        temp_num = db_num; 
       } 
       reader.Close(); 
      } 
      if (todaysdate != db_date) 
      { 
       using (SqlCommand dateUpate = new SqlCommand("UPDATE table SET tsDate='" + todaysdate + "' WHERE tsDate='" + db_date + "'", connection)) 
       { 
        dateUpate.ExecuteNonQuery(); 
       } 
       db_num = 0; 
       db_date = todaysdate; 
      } 
      db_num++; 
      using (SqlCommand numUpate = new SqlCommand("UPDATE table SET tsNum='" + db_num + "' WHERE tsNum='" + temp_num + "'", connection)) 
      { 
       numUpate.ExecuteNonQuery(); 
      } 
      result = Convert.ToInt32(db_date + db_num.ToString().PadLeft(3, '0')); 
      connection.Close(); 
      connection.Dispose(); 
     } 
     return result; 
    } 
} 
+0

創建服務客戶端的實例並調用相應的方法。 –

+0

@GiorgiNakeuri我的項目現在離我的項目應該有多近? –

回答

0

問題二的答案您可能必須去頂部的工具NuGe t程序包管理器,程序包管理控制檯,然後鍵入以下命令以安裝這三個函數的程序包。 PM>安裝包RIAServices.Silverlight.DomainDataSource