2015-06-19 3 views
0

В моем проекте Silverlight есть ссылки на клиент Silverlight Silver Services, а мое приложение .web имеет доступ к RIAServices.Server.Silverlight разговаривает с WCF с помощью службы RIA Silverlight Client

Я не могу найти хороший учебник, чтобы узнать, как его подключить. Как только я понимаю, как получить данные из моего метода NumberGenerator. Я могу забрать его оттуда. У меня есть три вопроса, с которыми мне нужна помощь.

Во-первых, правильно ли настроен этот проект? Раньше я никогда не делал проект с RIA.

Во-вторых, какую ссылку мне нужно использовать ServiceContract(), FaultContract и OperationContract? Большинство примеров показывают, что они находятся в библиотеке System.ServiceModel. В этом случае с использованием внешней библиотеки RIA Services Silverlight Client это не так. Он выдает ошибку, говоря, что мне не хватает ссылки. В каких других библиотеках были бы эти трое?

Последний вопрос: какой URI вы используете в SystemDomainContext? Где я нашел код при использовании этого MyFirstRIAApplication-Web-EmployeeDomainService.svc, но в моем случае у меня нет ничего, что имеет расширение .svc. Использую ли я .xap или .aspx?

Вот мой Silverlight код

Вот мой NumberGenerator Silverlight UserControl страницу Код

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; 
     } 
    } 
} 

Вот класс Domain Conext System на 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); 
     } 
    } 
} 

Вот мой Доменные службы системы класса, который находится на Silverlight.web

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

Вот класс NumberGenerator на Silverlight .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> Install-Package RIAServices.Silverlight.DomainDataSource