178 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			178 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.IO;
 | 
						|
using System.Runtime.Serialization.Formatters.Binary;
 | 
						|
using Csla.WebServiceHost;
 | 
						|
 | 
						|
namespace Csla.DataPortalClient
 | 
						|
{
 | 
						|
  /// <summary>
 | 
						|
  /// Implements a data portal proxy to relay data portal
 | 
						|
  /// calls to a remote application server by using 
 | 
						|
  /// Web services.
 | 
						|
  /// </summary>
 | 
						|
  public class WebServicesProxy : DataPortalClient.IDataPortalProxy
 | 
						|
  {
 | 
						|
    private WebServiceHost.WebServicePortal GetPortal()
 | 
						|
    {
 | 
						|
      WebServiceHost.WebServicePortal wsvc = 
 | 
						|
        new WebServiceHost.WebServicePortal();
 | 
						|
      wsvc.Url = ApplicationContext.DataPortalUrl.ToString();
 | 
						|
      return wsvc;
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    /// <summary>
 | 
						|
    /// Called by <see cref="DataPortal" /> to create a
 | 
						|
    /// new business object.
 | 
						|
    /// </summary>
 | 
						|
    /// <param name="objectType">Type of business object to create.</param>
 | 
						|
    /// <param name="criteria">Criteria object describing business object.</param>
 | 
						|
    /// <param name="context">
 | 
						|
    /// <see cref="Server.DataPortalContext" /> object passed to the server.
 | 
						|
    /// </param>
 | 
						|
    public Server.DataPortalResult Create(
 | 
						|
      Type objectType, object criteria, Server.DataPortalContext context)
 | 
						|
    {
 | 
						|
      object result;
 | 
						|
      Csla.Server.Hosts.WebServicePortal.CreateRequest
 | 
						|
        request = new Csla.Server.Hosts.WebServicePortal.CreateRequest();
 | 
						|
      request.ObjectType = objectType;
 | 
						|
      request.Criteria = criteria;
 | 
						|
      request.Context = context;
 | 
						|
 | 
						|
      using (WebServiceHost.WebServicePortal wsvc = GetPortal())
 | 
						|
      {
 | 
						|
        byte[] rd = Serialize(request);
 | 
						|
        byte[] rp = wsvc.Create(rd);
 | 
						|
        result = Deserialize(rp);
 | 
						|
      }
 | 
						|
 | 
						|
      if (result is Exception)
 | 
						|
        throw (Exception)result;
 | 
						|
      return (Server.DataPortalResult)result;
 | 
						|
    }
 | 
						|
 | 
						|
    /// <summary>
 | 
						|
    /// Called by <see cref="DataPortal" /> to load an
 | 
						|
    /// existing business object.
 | 
						|
    /// </summary>
 | 
						|
    /// <param name="objectType">Type of business object to retrieve.</param>
 | 
						|
    /// <param name="criteria">Criteria object describing business object.</param>
 | 
						|
    /// <param name="context">
 | 
						|
    /// <see cref="Server.DataPortalContext" /> object passed to the server.
 | 
						|
    /// </param>
 | 
						|
    public Server.DataPortalResult Fetch(
 | 
						|
      Type objectType, object criteria, Server.DataPortalContext context)
 | 
						|
    {
 | 
						|
      object result;
 | 
						|
      Server.Hosts.WebServicePortal.FetchRequest request = 
 | 
						|
        new Server.Hosts.WebServicePortal.FetchRequest();
 | 
						|
      request.ObjectType = objectType;
 | 
						|
      request.Criteria = criteria;
 | 
						|
      request.Context = context;
 | 
						|
 | 
						|
      using (WebServiceHost.WebServicePortal wsvc = GetPortal())
 | 
						|
      {
 | 
						|
        result = Deserialize(wsvc.Fetch(Serialize(request)));
 | 
						|
      }
 | 
						|
 | 
						|
      if (result is Exception)
 | 
						|
        throw (Exception)result;
 | 
						|
      return (Server.DataPortalResult)result;
 | 
						|
    }
 | 
						|
 | 
						|
    /// <summary>
 | 
						|
    /// Called by <see cref="DataPortal" /> to update a
 | 
						|
    /// business object.
 | 
						|
    /// </summary>
 | 
						|
    /// <param name="obj">The business object to update.</param>
 | 
						|
    /// <param name="context">
 | 
						|
    /// <see cref="Server.DataPortalContext" /> object passed to the server.
 | 
						|
    /// </param>
 | 
						|
    public Server.DataPortalResult Update(object obj, Server.DataPortalContext context)
 | 
						|
    {
 | 
						|
      object result;
 | 
						|
      Server.Hosts.WebServicePortal.UpdateRequest request = new Server.Hosts.WebServicePortal.UpdateRequest();
 | 
						|
      request.Object = obj;
 | 
						|
      request.Context = context;
 | 
						|
 | 
						|
      using (WebServiceHost.WebServicePortal wsvc = GetPortal())
 | 
						|
      {
 | 
						|
        result = Deserialize(wsvc.Update(Serialize(request)));
 | 
						|
      }
 | 
						|
 | 
						|
      if (result is Exception)
 | 
						|
        throw (Exception)result;
 | 
						|
      return (Server.DataPortalResult)result;
 | 
						|
    }
 | 
						|
 | 
						|
    /// <summary>
 | 
						|
    /// Called by <see cref="DataPortal" /> to delete a
 | 
						|
    /// business object.
 | 
						|
    /// </summary>
 | 
						|
    /// <param name="criteria">Criteria object describing business object.</param>
 | 
						|
    /// <param name="context">
 | 
						|
    /// <see cref="Server.DataPortalContext" /> object passed to the server.
 | 
						|
    /// </param>
 | 
						|
    public Server.DataPortalResult Delete(object criteria, Server.DataPortalContext context)
 | 
						|
    {
 | 
						|
      object result;
 | 
						|
      Server.Hosts.WebServicePortal.DeleteRequest request = new Server.Hosts.WebServicePortal.DeleteRequest();
 | 
						|
      request.Criteria = criteria;
 | 
						|
      request.Context = context;
 | 
						|
 | 
						|
      using (WebServiceHost.WebServicePortal wsvc = GetPortal())
 | 
						|
      {
 | 
						|
        result = Deserialize(wsvc.Delete(Serialize(request)));
 | 
						|
      }
 | 
						|
 | 
						|
      if (result is Exception)
 | 
						|
        throw (Exception)result;
 | 
						|
      return (Server.DataPortalResult)result;
 | 
						|
    }
 | 
						|
 | 
						|
    /// <summary>
 | 
						|
    /// Get a value indicating whether this proxy will invoke
 | 
						|
    /// a remote data portal server, or run the "server-side"
 | 
						|
    /// data portal in the caller's process and AppDomain.
 | 
						|
    /// </summary>
 | 
						|
    public bool IsServerRemote
 | 
						|
    {
 | 
						|
      get { return true; }
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    #region Helper functions
 | 
						|
 | 
						|
    private static byte[] Serialize(object obj)
 | 
						|
    {
 | 
						|
      if (obj != null)
 | 
						|
      {
 | 
						|
        using (MemoryStream buffer = new MemoryStream())
 | 
						|
        {
 | 
						|
          BinaryFormatter formatter = new BinaryFormatter();
 | 
						|
          formatter.Serialize(buffer, obj);
 | 
						|
          return buffer.ToArray();
 | 
						|
        }
 | 
						|
      }
 | 
						|
      return null;
 | 
						|
    }
 | 
						|
 | 
						|
    private static object Deserialize(byte[] obj)
 | 
						|
    {
 | 
						|
      if (obj != null)
 | 
						|
      {
 | 
						|
        using (MemoryStream buffer = new MemoryStream(obj))
 | 
						|
        {
 | 
						|
          BinaryFormatter formatter = new BinaryFormatter();
 | 
						|
          return formatter.Deserialize(buffer);
 | 
						|
        }
 | 
						|
      }
 | 
						|
      return null;
 | 
						|
    }
 | 
						|
 | 
						|
    #endregion
 | 
						|
 | 
						|
  }
 | 
						|
}
 |