我有一个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模式的整个原则。最终新的类调用将与其他依赖项嵌套,我想避免这种情况。
所以我的问题是:如何在构造函数中实际注入class参数?
答案 0 :(得分:0)
这实际上是一个服务定位器注入,因为注入的元素是消息中心服务。这是个好消息。
您不必传入服务构造函数来查看模型构造函数。只需在您需要的地方请求服务:
public LoginViewModel()
{
MessagingCenterWrapper = App.Container.Resolve<IMessagingCenterWrapper>();
}
不要将视图模型粘贴到AutoFac中,除非它们确实是全局的。这类假IOC存在很多问题。
为了使整体更容易,这个怎么样:
// 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网站还提供了有关此主题的更详细讨论的链接。