---
id: generateproxysourcegeneratordemo
title: 源生成代理推荐写法
---

### 定义

命名空间：TouchSocket.Rpc <br/>
程序集：[TouchSocket.Rpc.dll](https://www.nuget.org/packages/TouchSocket.Rpc)


## 一、声明接口

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

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

```csharp showLineNumbers
/// <summary>
/// 定义服务接口。
/// </summary>
[GeneratorRpcProxy]
public interface IUserServer:IRpcServer
{
    [DmtpRpc]
    LoginResponse Login(LoginRequest request);
}
```

```csharp showLineNumbers
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`项目，然后用于实现接口。

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

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

所以类文件中，需要添加如下代码：

```csharp showLineNumbers
using TouchSocket.Rpc;

[assembly: GeneratorRpcServerRegister]
```

## 三、服务注册、启动

新建控制台项目，作为服务器，需要同时引用`RpcImplementationClassLibrary`和`RpcClassLibrary`。

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

```csharp showLineNumbers
var service = new TcpTouchRpcService();
var config = new TouchSocketConfig()//配置
       .SetListenIPHosts(new IPHost[] { new IPHost(7789) })
       .ConfigureContainer(a =>
       {
           a.AddConsoleLogger();
           a.AddFileLogger();
       })
       .ConfigureRpcStore(a => 
       {
           //此处使用的是源生成注册，具体可看文档》Rpc》注册服务
           store.RegisterAllFromRpcImplementationClassLibrary();
       })
       .SetDmtpOption(new DmtpOption()
       {
            VerifyToken = "Rpc"//连接验证口令。
       });
service.Setup(config);

service.Start();

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

## 四、创建客户端

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

```csharp {8}
TcpTouchRpcClient client = new TcpTouchRpcClient();
client.Setup(new TouchSocketConfig()
    .SetRemoteIPHost("127.0.0.1:7789")
    .SetDmtpOption(new DmtpOption()
    {
        VerifyToken = "Rpc"//连接验证口令。
    }));
client.Connect();

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

## 五、结束

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

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

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

[推荐写法示例](https://gitee.com/RRQM_Home/TouchSocket/tree/master/examples/Dmtp)

