gpt4 book ai didi

c# - 如何使用 Xamarin 和 Autofac 将构造函数依赖项注入(inject) ViewModel?

转载 作者:太空狗 更新时间:2023-10-29 22:02:12 25 4
gpt4 key购买 nike

我有一个 ViewModel,我想向其中注入(inject)另一个类。我正在使用带有最新版本 Xamarin 的 Visual Studio。我正在使用 Autofac 来注册和解析依赖项。但我是新手,我遇到了一个我找不到解决方案的问题,尽管它可能很简单。

这是我要注入(inject)另一个类的类:

public IMessagingCenterWrapper MessagingCenterWrapper;

public LoginViewModel(IMessagingCenterWrapper messagingCenterWrapper){
MessagingCenterWrapper = messagingCenterWrapper;
}

然后在应用程序的入口点我有一个函数来初始化注册和解析依赖项的容器

static IContainer container{ get; set; }

public App ()
{
InitializeComponent();

InitializeIOCContainer();
}

void InitializeIOCContainer()
{
var builder = new ContainerBuilder();
builder.RegisterType<LoginViewModel>();
builder.RegisterType<MessagingCenterWrapper>().As<IMessagingCenterWrapper>();
container = builder.Build();

var wrapper = container.Resolve<IMessagingCenterWrapper>();
var viewModel = container.Resolve<LoginViewModel>();
}

但是在登录 View 中构建时出现错误:

 BindingContext = new LoginViewModel();

我收到错误是因为我没有在调用中初始化参数。

但如果我这样做,我不会破坏 IoC 模式的整个原则。最终新的类调用将与其他依赖项嵌套在一起,我想避免这种情况。

所以我的问题是:如何在构造函数中实际注入(inject)类参数?

最佳答案

这实际上是一个服务定位器注入(inject),因为注入(inject)的元素是一个消息中心服务。这是个好消息。

您不必传入服务构造函数来查看模型构造函数。只需在您需要的地方请求服务:

public LoginViewModel()  
{
MessagingCenterWrapper = App.Container.Resolve<IMessagingCenterWrapper>();
}

不要将 View 模型粘贴到 AutoFac 中,除非它们确实是全局的。这种假的国际奥委会存在很多问题。

为了让整体更简单,这个怎么样:

// MUST BE PUBLIC 
public static IContainer Container{ get; set; }

static App()
{
InitializeIOCContainer();
}

public App ()
{
InitializeComponent();
}

private static void InitializeIOCContainer()
{
var builder = new ContainerBuilder();
builder.RegisterType<MessagingCenterWrapper>().As<IMessagingCenterWrapper>();
Container = builder.Build();

// Don't stick view models in the container unless you need them globally, which is almost never true !!!

// Don't Resolve the service variable until you need it !!!! }
}

这些备注的完整代码在https://github.com/marcusts/xamarin-forms-annoyances .请参阅名为 AwaitAsyncAntipattern.sln 的解决方案。

GitHub 站点还提供了有关此主题的更详细讨论的链接。

关于c# - 如何使用 Xamarin 和 Autofac 将构造函数依赖项注入(inject) ViewModel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47287770/

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