如何使用Xamarin和Autofac将构造函数依赖项注入ViewModel?
我有一个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(); builder.RegisterType().As(); container = builder.Build(); var wrapper = container.Resolve(); var viewModel = container.Resolve(); }
但是在登录视图中的行中构建时出错:
BindingContext = new LoginViewModel();
我收到错误,因为我没有初始化调用中的参数。
但是,如果我这样做,我不会破坏IoC模式的整个原则。 最终新的类调用将与其他依赖项嵌套,我想避免这种情况。
所以我的问题是:如何在构造函数中实际注入class参数?
这实际上是一个服务定位器注入,因为注入的元素是消息中心服务。 那是好消息。
您不必传入服务构造函数来查看模型构造函数。 只需在您需要的地方申请服务:
public LoginViewModel() { MessagingCenterWrapper = App.Container.Resolve(); }
不要将视图模型粘贴到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().As(); 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站点还提供了有关此主题的更详细讨论的链接。
- Autofac解析通用控制器
- 如何在AutoFac中使用Property Injection?
- Autofac – 无法创建请求生命周期范围,因为HttpContext不可用 – 由于异步代码?
- 如何使用Autofac来解析Nancy创建的子生命周期范围中的类型的每个请求依赖项的实例
- 仅仅为Owned 在我的项目中引用Autofac是不好的设计?
- 注册没有特定构造函数签名的控制器时,已添加具有相同键的项
- .NET 4,AllowPartiallyTrustedCallers属性和SecurityCritical等安全标记
- 如何将依赖项名称作为构造函数参数注入
- Autofac解决CQRS CommandDispatcher中的依赖关系