跳到主要内容
版本:2.1

源生成代理推荐写法

定义

命名空间:TouchSocket.Rpc
程序集:TouchSocket.Rpc.dll

一、声明接口

TouchSocket中,关于Rpc,我们有更为推荐的写法。详细步骤如下:

(1)新建类库项目,命名为RpcClassLibrary。然后在该程序集中,定义服务接口,和接口参数实体类。

/// <summary>
/// 定义服务接口。
/// </summary>
[GeneratorRpcProxy]
public interface IUserServer:IRpcServer
{
[DmtpRpc]
LoginResponse Login(LoginRequest request);
}
public class LoginRequest:RequestBase
{
public string Account { get; set; }
public string Password { get; set; }
}

public class LoginResponse : ResponseBase
{
}

//下面两个是请求和响应的基类,可以根据业务增加其他字段
public class RequestBase
{
}

public class ResponseBase
{
public Result Result { get; set; }
}

二、实现接口

新建类库项目,命名RpcImplementationClassLibrary,引用RpcClassLibrary项目,然后用于实现接口。

public class UserServer : IUserServer
{
public LoginResponse Login(LoginRequest request)
{
//返回假逻辑
return new LoginResponse() { Result=Result.Success};
}
}

然后新建类文件,命名为AssemblyInfo.cs,用于存放程序集相关配置。此处的目的是设置Rpc服务自动注册。

所以类文件中,需要添加如下代码:

using TouchSocket.Rpc;

[assembly: GeneratorRpcServerRegister]

三、服务注册、启动

新建控制台项目,作为服务器,需要同时引用RpcImplementationClassLibraryRpcClassLibrary

如果作为服务器,需要按接口注册服务

var service = new TcpDmtpService();
var config = new TouchSocketConfig()//配置
.SetListenIPHosts(new IPHost[] { new IPHost(7789) })
.ConfigureContainer(a =>
{
a.AddConsoleLogger();
a.AddRpcStore(store =>
{
////此处使用限定名称,因为源代码生成时,也会生成TouchSocket.Rpc.Generators.IUserServer的接口
//store.RegisterServer<RpcClassLibrary.ServerInterface.IUserServer, UserServer>();

//此处使用的是源生成注册,具体可看文档》Rpc》注册服务
store.RegisterAllFromRpcImplementationClassLibrary();
});
})
.ConfigurePlugins(a =>
{
a.UseDmtpRpc();
})
.SetDmtpOption(new DmtpOption()
{
VerifyToken = "Dmtp"
});//设定连接口令,作用类似账号密码

await service.SetupAsync(config);
await service.StartAsync();

service.Logger.Info($"{service.GetType().Name}已启动");

四、创建客户端

作为客户端仅引用RpcClassLibrary即可。直接调用即可。

var client = new TcpDmtpClient();
await client.SetupAsync(new TouchSocketConfig()
.SetRemoteIPHost("127.0.0.1:7789")
.ConfigurePlugins(a =>
{
a.UseDmtpRpc();
})
.SetDmtpOption(new DmtpOption()
{
VerifyToken = "Dmtp"
}));
await client.ConnectAsync();

//Login即为在RpcClassLibrary中自动生成的项目
var response = client.GetDmtpRpcActor().Login(new RpcClassLibrary.Models.LoginRequest() { Account = "Account", Password = "Account" });
Console.WriteLine(response.Result);

五、结束

推荐写法的演示,是为实际项目编写提供参考。经过框架的搭建,后续的开发将变得简单。

例如:当需要添加一个功能时,只需要在RpcClassLibrary中添加一个接口服务,或者在现有服务中添加函数,然后在RpcImplementationClassLibrary实现接口即可。其余注册工作将自动完成。

同时,当你需要调用Rpc时,只需要把RpcClassLibrary作为项目引用,或者dll引用。因为RpcClassLibrary中仅包含服务接口、参数实例和源生成的调用方法,所以不会泄漏敏感数据(前提是您在编写代码时,并无在RpcClassLibrary中包含敏感信息)。

推荐写法示例