我正在使用MVVM Light Toolkit,特别是SimpleIoc构建WPF应用程序。
我有一个父视图模型,可以动态创建子视图模型。这样做时,我使用“标准”依赖注入将IConfigService作为参数传递给构造函数。我希望IConfigService成为每个子视图模型的唯一实例。所以我试试这个:
IConfigService service = SimpleIoc.Default.GetInstance<IConfigService>(key);
ChildViewModel vm = new ChildViewModel(service);
其中key是每个子视图模型的唯一标识符。根据MVVM Light和SimpleIoc的文档,这个GetInstance方法:
...提供了一种获取与给定键对应的给定类型的实例的方法。如果之前没有使用此密钥实例化实例,则将创建一个新实例。
还有一个注释,该类必须先注册,否则返回null。就我而言,它一直是在ViewModelLocator中:
var configService = new ConfigService();
SimpleIoc.Default.Register<IConfigService>(() => configService);
但是,GetInstance调用每次都返回相同的实例。
我在这做错了什么?
您注册了一个已经实例化的对象。
SimpleIoc不会使用此重载创建自己的实例。它总是返回configService
。您需要在lambda中执行实例化,因为您正在使用工厂重载,或者您只需传递ConfigService
类型就可以更轻松地执行此操作。 SimpleIoc将负责实例化本身。