【问题标题】:How to create a dotnet gRPC server without using concrete instances如何在不使用具体实例的情况下创建 dotnet gRPC 服务器
【发布时间】:2023-10-10 21:06:01
【问题描述】:

所以我正在尝试构建一个同时具有 REST 和 gRPC 的 .Net Core 应用程序。

预期结果:运行一个应用程序,该应用程序支持一个端口上的工作 REST 和另一个端口上的 gRPC。

REST 很简单。这是应用程序开始的地方。但是要配置 gRPC 的端口,我看到我需要创建一个服务器实例:

        Server server = new Server
        {
            Services = { Greeter.BindService(new GreeterImpl()) }
            Ports = { new ServerPort("0.0.0.0", 5001, ServerCredentials.Insecure) }
        };

        server.Start();

这一切都很好,直到我们真正使用它并且像任何其他“控制器”GreeterImpl 一样需要服务的依赖注入:

        private readonly IExampleService _exampleService;

        public GreeterImpl (IExampleService exampleService)
        {
            _exampleService = exampleService;
        }

现在第一个代码 sn-p 将不起作用,因为“new GreeterImpl()”需要一个 IExampleService。 我在网上搜索了如何在不使用具体实现的情况下获取 ServerServiceDefinition (从 Greeter.BindService() 返回的东西),但一无所获。那么,这应该怎么做呢,还是我走上了完全错误的道路?

【问题讨论】:

  • 假设您将 ASP.NET Core 用于 REST API,使用 gRPC implementation that builds upon ASP.NET Core 会更容易。这样,您最终会在 gRPC 和 REST 之间共享相同的应用程序功能和服务容器,而它们只是不同的端点。

标签: grpc grpc-dotnet


【解决方案1】:

所以,我的想法是错误的。转我们你可以使用

app.ApplicationServices.GetService(typeof({YOUR_SERVICE}))

其中“app”是“IApplicationBuilder” 然后只需在“.BindService()”中使用生成的服务。 最后,我们没有更改“.BindService()”,而是将其传递给绑定的工作服务。

重要提示:您必须先注册您的服务。就我而言,我使用 AutoFac 注册它

【讨论】:

    最近更新 更多