【发布时间】:2018-04-27 12:27:15
【问题描述】:
我有一个 ViewModel,我想向其中注入另一个类。我正在将 Visual Studio 与最新版本的 Xamarin 一起使用。我正在使用 Autofac 注册和解析依赖项。但我是新手,我遇到了一个我找不到解决方案的问题,即使它可能很简单。
这是我要注入另一个类的类:
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>();
}
但是在登录视图中的行构建时出现错误:
BindingContext = new LoginViewModel();
我收到错误是因为我没有在调用中初始化参数。
但如果我这样做,我不会破坏 IoC 模式的整个原则。最终新的类调用将与其他依赖项嵌套,我想避免这种情况。
所以我的问题是:我如何在构造函数中实际注入类参数?
【问题讨论】:
-
在执行
BindingContext = new LoginViewModel();时,您根本没有使用 DI 容器。 -
@Fildor 你能解释一下它是如何完成的吗?因为容器是App入口点类的私有变量,在View中调用
BindingContext = new LoginViewModel();。 -
我承认我不知道 Autofac 的最佳实践。但我看到容器在 App 中是静态的。因此,您可以添加一个静态属性来解析 getter 中的实例。
-
调用
Resolve<T>不是反模式。你误会了。您需要调用Resolve<T>才能让Autofac 为您创建对象。他们试图告诉你的是,从任何地方调用Resolve<T>,但 Composition Root 是 一种反模式。为了能够解析根对象,您将必须调用Resolve<T>。没有办法解决这个问题。 -
在 WPF 中可以做的是解析视图,然后调用 view.Show();。视图会将 LoginViewModel 作为构造函数中的参数,然后在第一行中将 DataContext 设置为 LoginViewModel 参数。
标签: c# dependency-injection xamarin.forms inversion-of-control autofac