动态 C# API 客户端

    你的service或controller需要实现一个在服务端和客户端共享的接口.因此,首先需要在一个共享的类库项目中定义一个服务接口.例如:

    为了能自动被发现,你的接口需要实现IRemoteService接口.由于IApplicationService继承自IRemoteService接口.所以IBookAppService完全满足这个条件.

    在你的服务中实现这个类,你可以使用将你的服务暴漏为一个REST API 端点.

    首先,将Volo.Abp.Http.Client nuget包添加到你的客户端项目中:

    1. Install-Package Volo.Abp.Http.Client

    然后给你的模块添加AbpHttpClientModule依赖:

    1. [DependsOn(typeof(AbpHttpClientModule))] //添加依赖
    2. public class MyClientAppModule : AbpModule
    3. {
    4. }

    AddHttpClientproxies方法获得一个程序集,找到这个程序集中所有的服务接口,创建并注册代理类.

    appsettings.json文件中的RemoteServices节点被用来设置默认的服务地址.下面是最简单的配置:

    1. {
    2. "RemoteServices": {
    3. "Default": {
    4. }
    5. }
    6. }

    查看下面的”AbpRemoteServiceOptions”章节获取更多详细配置.

    可以很直接地使用.只需要在你的客户端程序中注入服务接口:

    1. public class MyService : ITransientDependency
    2. {
    3. private readonly IBookAppService _bookService;
    4. public MyService(IBookAppService bookService)
    5. {
    6. _bookService = bookService;
    7. }
    8. public async Task DoIt()
    9. {
    10. var books = await _bookService.GetListAsync();
    11. foreach (var book in books)
    12. {
    13. }
    14. }
    15. }

    本例注入了上面定义的IBookAppService服务接口.当客户端调用服务方法的时候动态客户端代理就会创建一个HTTP调用.

    默认情况下AbpRemoteServiceOptionsappsettings.json获取.或者,你可以使用Configure方法来设置或重写它.如:

    上面的例子已经配置了”Default”远程服务端点.你可能需要为不同的服务创建不同的端点.(就像在微服务方法中一样,每个微服务具有不同的端点).在这种情况下,你可以在你的配置文件中添加其他的端点:

    1. {
    2. "Default": {
    3. "BaseUrl": "http://localhost:53929/"
    4. },
    5. "BookStore": {
    6. "BaseUrl": "http://localhost:48392/"
    7. }
    8. }
    9. }

    AddHttpClientProxies方法有一个可选的参数来定义远程服务的名字:

    1. context.Services.AddHttpClientProxies(
    2. typeof(BookStoreApplicationContractsModule).Assembly,
    3. remoteServiceConfigurationName: "BookStore"
    4. );

    remoteServiceConfigurationName参数会匹配通过AbpRemoteServiceOptions配置的服务端点.如果BookStore端点没有定义就会使用默认的Default端点.

    当你为IBookAppService创建了一个服务代理,你可以直接注入IBookAppService来使用代理客户端(像上面章节中将的那样).你可以传递asDefaultService:falseAddHttpClientProxies方法来禁用此功能.