【发布时间】: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 以及还有什么问题:(?