【问题标题】:C# Asp.net core Dependency injection using RestSharp使用 RestSharp 的 C# Asp.net core 依赖注入
【发布时间】:2020-04-25 18:07:00
【问题描述】:

我目前正在使用 RestClient 从网站获取数据。 我希望能够在使用 Client 类的 asp.net 核心项目的控制器类中使用依赖注入。 当我在调用控制器并将断点放入控制器时尝试使用依赖注入时,它不会被命中。这是因为我没有正确设置客户端依赖注入。

下面是我的 Client 类,它实现了 IClient 接口。

public class Client: IClient
{
    public RestClient RestClient { get; set; }
    public Client()
    {
        RestClient = new RestClient("https://eonet.sci.gsfc.nasa.gov/api/v2.1/");
    }

    public async Task<List<EventDTO>> GetAll()
    {
        var request = new RestRequest("events", Method.GET);
        var content = await RestClient.GetAsync<RootObject>(request);
        return Event;
    }

    public async Task<RootObject> Get(string id)
    {
        var request = new RestRequest("events?source=" + "InciWeb", Method.GET);
        RootObject content = null;
        content = await RestClient.GetAsync<RootObject>(request);
        return content;
    }
}

在启动ConfigureServices方法中。

  services.AddTransient<IClient, Client>();

在我的控制器中,我做了以下事情:

private readonly IClient _client;

public EventsController(IClient client)
{
    _client = client;
}

我不确定是否可以在构造函数中创建客户端的任何实例。 有人可以告诉我我做错了什么。 谢谢

【问题讨论】:

  • 您能重新表述您的问题吗?好像不是很清楚
  • 如果您问是否可以通过构造函数注入依赖项,答案是肯定的。构造函数注入几乎总是比属性注入更可取,这对于某些 IoC 容器来说是不确定的。因此,就依赖注入而言,您上面的代码应该可以工作。但是,您的代码存在一些设计问题。如果这是生产代码,我建议您重构。
  • 构造函数注入对我不起作用,我不明白为什么。
  • @GreatKhan2016 你能详细说明什么不起作用吗?控制器null 中的_client 字段是否在运行时?代码存在一些设计问题,例如硬编码的 url 而不是客户端提供它,不使用 .ConfigureAwait(false) 作为可等待对象等。
  • 实际上它现在正在工作。我知道硬编码的网址不好,但是为什么我需要使用 configureAwait false 以及还有什么问题:(?

标签: c# dependency-injection


【解决方案1】:

最好的方法是将 IRestClient 注入客户端。 然后创建您的 RestRequest 并使用可注入的 IRestClient 执行

请看下面的例子

     public class Client : IClient
    {
        private readonly IRestClient _restClient;
        public Client(IRestClient restClient)
        {
            _restClient = restClient;
            _restClient.BaseUrl = new Uri("https://eonet.sci.gsfc.nasa.gov/api/v2.1/");
        }

        public async Task<List<EventDTO>> GetAll()
        {
            var request = new RestRequest("events", Method.GET);
            var content = await _restClient.GetAsync<RootObject>(request);
            return content.Event;
        }

        public async Task<RootObject> Get(string id)
        {
            var request = new RestRequest("events?source=" + "InciWeb", Method.GET);
            RootObject content = null;
            content = await _restClient.GetAsync<RootObject>(request);
            return content;
        }
    }

将 IRestClient 注册为 Transient 并将您的 Client 注册为 Singleton 到 IServiceCollection 请检查示例 ConfigureServices

  services.AddTransient<IRestClient, RestClient>();
  services.AddSingleton<IClient, Client>();

【讨论】:

  • 请在您的回答中添加一些解释
  • 我必须去阅读 RestSharp 文档,因为我真的很讨厌我应该在我的代码中“新建”RestRequest,因为这似乎使单元测试成为不可能,或者真的很棘手。
猜你喜欢
  • 2016-09-27
  • 1970-01-01
  • 2018-01-16
  • 1970-01-01
  • 2019-02-22
  • 1970-01-01
  • 2021-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多