C# 为什么实现接口的对象不能在服务注入时转换为类型?
我在注入方面遇到问题,因为无法将C# 为什么实现接口的对象不能在服务注入时转换为类型?,c#,asp.net,.net,asp.net-core,C#,Asp.net,.net,Asp.net Core,我在注入方面遇到问题,因为无法将OneSignalClient转换为类型ipusnotificationclientOneSignalClient实现IOneSignalClient和IOneSignalClient实现ipusnotificationclient。但为什么它不被转换呢 我有这样的代码结构,可以像这样注入推送通知 services.AddScoped( typeof(IPushNotificationClient<ICreateNotificationEnd
OneSignalClient
转换为类型ipusnotificationclient
OneSignalClient
实现IOneSignalClient
和IOneSignalClient
实现ipusnotificationclient
。但为什么它不被转换呢
我有这样的代码结构,可以像这样注入推送通知
services.AddScoped(
typeof(IPushNotificationClient<ICreateNotificationEndpoint<CreateNotificationResponse, CreateNotification>>),
f => new OneSignalClient(
this.Configuration.GetSection("OneSignalSettings")["Endpoint"],
this.Configuration.GetSection("OneSignalSettings")["AppId"],
new HttpClientHandler()));
services.AddScoped(
类型(IPushNotificationClient),
f=>新的OneSignalClient(
this.Configuration.GetSection(“OneSignalSettings”)[“Endpoint”],
this.Configuration.GetSection(“OneSignalSettings”)[“AppId”],
新的HttpClientHandler());
下面是结构图
public class OneSignalClient : IOneSignalClient
{
public OneSignalClient(string apiEndpoint, string appId, IHttpClientHandler httpClient)
{
this.CreateNotification = new CreateNotificationEndpoint(apiEndpoint, appId, httpClient);
}
public ICreateNotificationEndpoint CreateNotification { get; private set; }
}
public interface IOneSignalClient: IPushNotificationClient<ICreateNotificationEndpoint>
{
}
public interface ICreateNotificationEndpoint:
PushNotification.Endpoints.ICreateNotificationEndpoint<CreateNotificationResponse, CreateNotification>
{
}
public interface IPushNotificationClient<TCreate>
{
TCreate CreateNotification { get; }
}
//service
public class PushNotificationService : IPushNotificationService{
private readonly IPushNotificationClient<ICreateNotificationEndpoint<CreateNotificationResponse, CreateNotification>> pnsClient;
public PushNotificationService(IPushNotificationClient<ICreateNotificationEndpoint<CreateNotificationResponse, CreateNotification>> pnsClient)
{
this.pnsClient = pnsClient;
}
}
公共类OneSignalClient:OneSignalClient
{
public OneSignalClient(字符串apiEndpoint、字符串appId、IHttpClientHandler httpClient)
{
this.CreateNotification=新的CreateNotificationEndpoint(apiEndpoint、appId、httpClient);
}
公共ICreateNotificationEndpoint CreateNotification{get;private set;}
}
公共接口客户端:IPushNotificationClient
{
}
公共接口ICreateNotificationEndpoint:
PushNotification.Endpoints.ICreateNotificationEndpoint
{
}
公共接口IPushNotificationClient
{
TCreate CreateNotification{get;}
}
//服务
公共类PushNotificationService:IPushNotificationService{
私有只读iPusNotificationClient pnsClient;
公共推送通知服务(IPushNotificationClient pnsClient)
{
this.pnsClient=pnsClient;
}
}
ipusnotificationclient
无法转换为ipusnotificationclient
。这显然不是一场比赛
但是您的ICreateNotificationEndpoint
派生自ICreateNotificationEndpoint
,这是两种不同的接口类型
只要决定在任何地方使用哪个界面,不要混淆它们。
您没有在此处定义别名
public interface ICreateNotificationEndpoint:
PushNotification.Endpoints.ICreateNotificationEndpoint<CreateNotificationResponse, CreateNotification>
公共接口ICreateNotificationEndpoint:
PushNotification.Endpoints.ICreateNotificationEndpoint
这是一个新的类型定义,使事情变得不兼容
除非你想尝试使用协方差或逆方差,但为什么要把事情弄得复杂。为你的未来利益上一节术语课。类/结构不继承接口,而是实现接口。仅仅因为两种类型表现出特定的继承/实现关系,这并不意味着在这两种类型上参数化的泛型表现出相同的关系。