gpt4 book ai didi

c# - 通过依赖注入(inject)进行多重导航控制

转载 作者:行者123 更新时间:2023-12-03 10:25:41 24 4
gpt4 key购买 nike

我的基础内容类。我用这个类作为我项目的主题。我不知道此信息是否相关。在这里,我创建了一个会重载导航方法的抽象方法。

public abstract class BaseContentPage : ContentPage
{
public readonly BaseViewModel BaseViewModel;

public BaseContentPage(BaseViewModel baseViewModel)
{
BaseViewModel = baseViewModel;
}

public abstract void Navigate(SelectedItemChangedEventArgs e);
}

在我构建依赖注入(inject)公共(public)类定位器的定位器中。在这个类中主要侧重于将这个类添加到容器中,使所有代码丢失耦合
    private readonly ContainerBuilder _builder;

public Locator()
{
_builder = new ContainerBuilder();
RegisterTypes();
Container = _builder.Build();
}

public IContainer Container { get; set; }

private void RegisterTypes()
{
_builder.RegisterType<WardListService>().As<IWardListService>();
_builder.RegisterType<WardListPageViewModel>();
_builder.RegisterType<WardListPage>();

_builder.RegisterType<PatientService>().As<IPatientService>();
_builder.RegisterType<PatientListPageViewModel>();
_builder.RegisterType<PatientListViewPage>();

_builder.RegisterType<PatientDetailsPageViewModel>();
_builder.RegisterType<PatientDetailsViewPage>(); }

在我的 app.Xaml.Cs 文件
 public App()
{
InitializeComponent();
Locator locator = new Locator();
Container = locator.Container;
MainPage = new NavigationPage(Container.Resolve<WardListPage>());
}

public static IContainer Container;

我在页面后面的 View 代码中使用此方法进行导航
    public async override void Navigate(SelectedItemChangedEventArgs e)
{
PatientDetailsViewPage patientDetailsViewPage = App.Container.Resolve<PatientDetailsViewPage>();
patientDetailsViewPage.BaseViewModel.SelectedPatient = e.SelectedItem as PatientViewModel;
await Navigation.PushAsync(patientDetailsViewPage);
}

此代码运行良好,但只能导航到一页。这意味着作为一个页面上的示例,我们有两个按钮可以导航到两个不同的页面。我不知道如何使用上面的导航重载器来实现这个任务。如何做到这一点任何人都可以提出解决问题的建议吗?另外,我使用 autofac 进行依赖注入(inject) 谢谢

最佳答案

You can define container in your CustomNavigationPage and use in every navigation page instance.


public class CustomNavigationPage : NavigationPage
{
public static IContainer Container;

public CustomNavigationPage()
{
Locator locator = new Locator();
locator.RegisterTypes();
Container = locator.Container();
}
}

这是我提到的虚拟代码。

您创建了一个自定义的导航页面。因此,您可以使用它来导航您的页面,例如:
CustomNavigationPage.PushASync(new TestPage(Container.Resolve<WardListPage>())):

如果使用它,您的自定义导航页面将在每次调用时解析您的依赖项。

To improve performance you can register your dependencies with singleton pattern. When the app started, dependencies will be registered. After you use this registered dependencies.



有一个改进:您使用单例模式定义了一个静态定位器,它在 app.cs 中注册依赖项
public sealed class Locator
{
private static Locator locator = null;
private static readonly object padlock = new object();

Locator()
{
//your registries
}

public static Locator Locator
{
get
{
lock (padlock)
{
if (locator == null)
{
locator = new Locator();
}
return locator;
}
}
}
}

还有你的 app.cs :
 public App()
{
InitializeComponent();
Locator locator = new Locator();
Container = locator.Container;
.
.
}

public static IContainer Container;

这样,您只需注册一次依赖项。没有重复的代码。只会使用一个实例。

关于c# - 通过依赖注入(inject)进行多重导航控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55293321/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com