C# 库如何知道使用者是否实现了库接口并将其注册到DI容器中?
我正在学习Xamarin.Forms,并尝试在以下场景中使用DI 共享项目(或库)有一个与DI相关的类,如下所示C# 库如何知道使用者是否实现了库接口并将其注册到DI容器中?,c#,xamarin,C#,Xamarin,我正在学习Xamarin.Forms,并尝试在以下场景中使用DI 共享项目(或库)有一个与DI相关的类,如下所示 public static class Startup { public static ServiceProvider CreateServiceProvider(Action<IServiceCollection> nativeConfigureServices) { IServiceCollection isc = new Servic
public static class Startup
{
public static ServiceProvider CreateServiceProvider(Action<IServiceCollection> nativeConfigureServices)
{
IServiceCollection isc = new ServiceCollection();
nativeConfigureServices(isc);
ConfigureServices(isc);
return isc.BuildServiceProvider();
}
static void ConfigureServices(IServiceCollection isc)
{
// others services are omitted for the sake of simplicity
isc.AddTransient<MainPageViewModel>();
isc.AddTransient<MainPage>();
isc.AddSingleton<App>();
}
}
public class NativeCall : INativeCall
{
public async Task FloatMessage(string msg)
{
Toast.MakeText(Application.Context, msg, ToastLength.Long).Show();
await Task.CompletedTask;
}
}
INativeCall
的一个实例被注入到MainPage
中,如下所示
public partial class MainPage : ContentPage
{
private readonly INativeCall nativeCall;
public MainPage(MainPageViewModel vm, INativeCall nativeCall)
{
InitializeComponent();
// others are omitted for the sake of simplicity
this.nativeCall = nativeCall;
}
private void Greeting_Clicked(object sender, System.EventArgs e)
{
nativeCall?.FloatMessage("I Love Xamarin.Forms");
}
}
然后,其他特定于操作系统的项目(Android、UWP、iOS)可以选择性地实现INativeCall
,并通过nativeConfigureServices
进行注册
为了简单起见,我选择了一个Android项目,如下所示
public static class Startup
{
public static ServiceProvider CreateServiceProvider(Action<IServiceCollection> nativeConfigureServices)
{
IServiceCollection isc = new ServiceCollection();
nativeConfigureServices(isc);
ConfigureServices(isc);
return isc.BuildServiceProvider();
}
static void ConfigureServices(IServiceCollection isc)
{
// others services are omitted for the sake of simplicity
isc.AddTransient<MainPageViewModel>();
isc.AddTransient<MainPage>();
isc.AddSingleton<App>();
}
}
public class NativeCall : INativeCall
{
public async Task FloatMessage(string msg)
{
Toast.MakeText(Application.Context, msg, ToastLength.Long).Show();
await Task.CompletedTask;
}
}
及
要消除运行时错误
System.InvalidOperationException:“在尝试激活“主页”时,无法解析类型“INativeCall”的服务。”
换句话说,库如何知道使用者是否实现了库接口并将其注册到DI容器中
System.InvalidOperationException:'无法解析类型的服务
尝试激活“主页”时出现“INativeCall”
这是一个容器,指示MainPage
具有一个它无法满足的构造函数依赖项
最简单的解决方案通常是改变:
public MainPage(MainPageViewModel vm, INativeCall nativeCall)
致:
指示依赖项是可选的
这将要求类中所有使用nativeCall
的人都要进行null
检查(因为nativeCall
可能已经提供,也可能没有提供)。就像你已经在使用nativeCall?.FloatMessage(“我爱Xamarin.Forms”)代码>
public MainPage(MainPageViewModel vm, INativeCall nativeCall)
public MainPage(MainPageViewModel vm, INativeCall nativeCall = null)