MAUI:DependencyService.Get<IMyService>() 返回 null

Ser*_*cat 5 .net maui

我正在尝试从 Xamarin 迁移到 MAUI。

下面的代码完美唤醒。

Xamarin 项目:

DependencyService.Get<IMyService>().Test();
Run Code Online (Sandbox Code Playgroud)

安卓:

[assembly: Dependency(typeof(MyService))]
namespace MyProject.Android
{
    public class MyService: IMyService
    {
        public void Test(){ 
            ////
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

IOS 和 Windows 依此类推。

但 MAUI 的DependencyService.Get 始终返回null。我找不到必须做出哪些新的改变。在我的主项目中重新编写基于 DependencyService 的所有代码将是痛苦的。

这种情况下应该做哪些改变呢?

Akl*_*kli 9

而不是自动注入您的服务实现:

[assembly: Dependency(typeof(MyService))]
Run Code Online (Sandbox Code Playgroud)

手动执行:

DependencyService.Register<IMyService, MyService>();
Run Code Online (Sandbox Code Playgroud)

在您的 MauiApplication 子类中(MauiWinUIApplication (windows)/MauiUIApplicationDelegate (ios)/ MauiApplication(android) ...等)


Fre*_*Ali 5

您在 MAUI 中没有平台依赖服务的概念,您可以使用条件编译或部分类来执行您需要执行的操作。

因此,如果您在此处查看 Microsoft 博客: https: //learn.microsoft.com/en-us/dotnet/maui/platform-integration/invoke-platform-code,它会向您展示如何使用这两种方式来调用平台代码。

所以通过条件编译得到Orientation:

#if ANDROID
using Android.Content;
using Android.Views;
using Android.Runtime;
#elif IOS
using UIKit;
#endif

using InvokePlatformCodeDemos.Services;

namespace InvokePlatformCodeDemos.Services.ConditionalCompilation
{
    public class DeviceOrientationService
    {
        public DeviceOrientation GetOrientation()
        {
#if ANDROID
            IWindowManager windowManager = Android.App.Application.Context.GetSystemService(Context.WindowService).JavaCast<IWindowManager>();
            SurfaceOrientation orientation = windowManager.DefaultDisplay.Rotation;
            bool isLandscape = orientation == SurfaceOrientation.Rotation90 || orientation == SurfaceOrientation.Rotation270;
            return isLandscape ? DeviceOrientation.Landscape : DeviceOrientation.Portrait;
#elif IOS
            UIInterfaceOrientation orientation = UIApplication.SharedApplication.StatusBarOrientation;
            bool isPortrait = orientation == UIInterfaceOrientation.Portrait || orientation == UIInterfaceOrientation.PortraitUpsideDown;
            return isPortrait ? DeviceOrientation.Portrait : DeviceOrientation.Landscape;
#else
            return DeviceOrientation.Undefined;
#endif
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

或部分课程

共享代码:

namespace InvokePlatformCodeDemos.Services.PartialMethods
{
    public partial class DeviceOrientationService
    {
        public partial DeviceOrientation GetOrientation();
    }
}
Run Code Online (Sandbox Code Playgroud)

平台代码:

using Android.Content;
using Android.Runtime;
using Android.Views;

namespace InvokePlatformCodeDemos.Services.PartialMethods;

public partial class DeviceOrientationService
{
    public partial DeviceOrientation GetOrientation()
    {
        IWindowManager windowManager = Android.App.Application.Context.GetSystemService(Context.WindowService).JavaCast<IWindowManager>();
        SurfaceOrientation orientation = windowManager.DefaultDisplay.Rotation;
        bool isLandscape = orientation == SurfaceOrientation.Rotation90 || orientation == SurfaceOrientation.Rotation270;
        return isLandscape ? DeviceOrientation.Landscape : DeviceOrientation.Portrait;
    }
}
Run Code Online (Sandbox Code Playgroud)