65.9K
CodeProject 正在变化。 阅读更多。
Home

.NET Remoting 使用 Broker 模式

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.28/5 (14投票s)

2005年2月24日

3分钟阅读

viewsIcon

47048

downloadIcon

1309

.NET remoting 使用 Broker 模式。

Sample Image

引言

对于 remoting 中的服务器激活对象,我们通常倾向于将服务器远程类暴露给客户端,以便在客户端构建代理对象。 我认为 remoting 的主要目标是确保服务器上的代码不必被发送到客户端。

我的文章将解释如何使用 Broker 模式隐藏服务器代码的实现。

应用程序包含使用服务器激活对象的 remoting 示例代码,并有助于更好地理解 Broker 模式。 应用程序使用带有二进制序列化的 TcpChannel

我的目标读者是那些了解基本 remoting 概念的人 :-)

Broker 模式 – 初始视图

通过将远程服务调用的实现细节封装到一个与业务组件本身不同的层中,从而隐藏它。

Sample Image

客户端应用程序(称为 ClientAPP)将从 BrokerInterface 调用方法,就像它调用任何本地接口一样。 但是,客户端接口内的这些方法会触发对远程应用程序(称为 ServerAPP)执行的服务。 这对客户端是透明的,因为远程服务对象实现了相同的接口。

BrokerInterface 是一个必要的抽象,它通过向客户端提供有关服务的契约来使分发成为可能,服务器提供这些契约而无需在客户端公开实现细节。 隔离、简单性和灵活性是使用此模式的主要好处。

功能

我的应用程序使用 .NET remoting 从服务器检索用户详细信息作为 DataSet。 使用以下机制来实现此功能

  • 服务器实现 Broker 接口和 MarshalByRefObject (程序集: RemoteComponents)
    public class UserManager : MarshalByRefObject,IUserManager
    {
        public DataSet listUserDetails()
        {
        //logic for retrieving user details
        }
    }

    UserManager 是一个远程启用的类,提供一个名为 listUserDetails() 的方法,该方法返回用户详细信息的列表。 用于检索用户详细信息的逻辑写在这里。

  • 创建监听器 (程序集: ServerAPP)
    RemotingConfiguration.RegisterWellKnownServiceType(
                typeof(UserManager),
                "UserDetails",
                WellKnownObjectMode.Singleton);

    * UserManager 的激活模式是单例,因此您在服务器上只有一个 UserManager 实例运行。 如果用户详细信息应该根据任何组而改变,那么激活模式可以更改为 SingleCall

  • Broker 接口中的方法声明 (程序集: BrokerInterface)。
    namespace BrokerInterface
    {
        public interface IUserManager
        {
            DataSet listUserDetails();
        }
    }

    这是提取的 IUserManager 接口的代码。 方法“listUserDetails”的实现将在部署在服务器中的 UserManager 类中编写。

  • 客户端检索 Broker 接口的实例 (程序集: ClientAPP)
    location="tcp://:4820/";
    
    IUserManager mgr= (IUserManager)Activator.GetObject(typeof(IUserManager),
                        location + "UserDetails");

    客户端程序调用 remoting 框架方法 Activator.GetObject() 来检索服务器上 UserManager 对象的代理。 该方法指定对象所在的位置以及应该返回的类型。

    在这种情况下,您应该在以下位置期望一个 IuserManager 对象:https://:4820/UserDetails。 拥有该实例后,您可以像在同一应用程序域中一样调用它上面的方法。

  • 客户端调用该代理接口对象上的一个方法,该方法会调用服务器功能。
    userDS=mgr.listUserDetails();

关注点

使用 .NET remoting 时,您必须仔细注意将应用程序部署到不同的程序集中。 我再次强调,主要目标是确保服务器上的代码不必被发送到客户端。

在此应用程序中发送给客户端的程序集

  • ClientAPP
  • BrokerInterface

服务器中需要的程序集

  • ServerAPP
  • BrokerInterface
  • RemoteComponents
© . All rights reserved.