单例实例化后更改ninject依赖的实现

时间:2016-01-08 02:57:43

标签: ninject mvvm-light xamarin-forms

所以,我在一个xamarin项目中有一个viewmodel类,我在app start上注入一些依赖关系到via ninject绑定。其中一个是IDialogService。

当我的应用程序中的MainPage发生更改时,会引发属性更改事件,并重新绑定对话框服务的实现,因为它与MainPage绑定。

如果我的viewmodel已经用let say DialogServiceA创建,然后当MainPage更改时我们重新绑定到DialogServiceB,我的viewmodel会使用服务A还是B?我认为它使用A,因此不会在UI中显示,因为它与不再存在的MainPage相关联。

因此,如果是这种情况,我怎样才能动态更改对话框服务,然后更新已经实例化的类,而不更改所有内容,以便每次使用时从容器中获取当前对话框服务(因此根本不会注入它)真的,并做更多的服务代理商)

此外,如果这种做法完全错误,请让我直截了当。

1 个答案:

答案 0 :(得分:0)

你是对的。重新配置容器不会影响已经实例化的对象。

如果您想在不重新设置从属(父ViewModel)的情况下更改依赖关系,那么您有几种可能性:

  • 每次都使用工厂来实现服务。实施Abstract Factory (Site by Mark Seeman)或使用Ninject.Extensions.Factory来执行此操作
  • 而不是直接注入服务,注入适配器。然后,适配器将请求重定向到当前适当的服务。为此,可以将所有服务注入适配器,也可以使用上述可能的工厂。
  • 而不是直接注入服务,注入代理。代理与适配器非常相似,但不是专门编写每个方法/属性重定向,而是通过拦截器对通用重定向进行编码。这是tutorial on castle dynamic proxy

但是,在一天结束时,我相信您还需要一种方法来管理何时更改服务/应该是什么。这可能是一种设计替代品,它不依赖于以这种方式交换物体......这将使它更容易(从而更好?)设计。

编辑:我刚看到你也将问题标记为xamarin-forms。在这种情况下,它很可能不会成为使用动态代理或ninject.extensions.factory的选项(它也依赖于动态代理)。为什么?并非所有平台都支持动态代理/ IL发射,AFAIR专门针对Apple设备而无法完成。