C# 库如何知道使用者是否实现了库接口并将其注册到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

我正在学习Xamarin.Forms,并尝试在以下场景中使用DI

共享项目(或库)有一个与DI相关的类,如下所示

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)