Blazor依赖注入:用工厂方法实现同服务多参数ViewModel实例注入
解决方案:用工厂模式动态创建ViewModel
你当前的代码存在核心问题:DI容器对同一类型的多次注册会覆盖之前的配置,所以最终只会得到注入ProductEditor_ViewModel的Editor_Small_ViewModel实例,无法实现根据用户选择切换子ViewModel的需求。下面是用工厂模式实现的具体方案:
1. 定义工厂接口
首先创建一个工厂接口,明确创建不同类型Editor的方法:
public interface IEditorSmallViewModelFactory { // 创建带ButtonEditor的父ViewModel Editor_Small_ViewModel CreateButtonEditor(); // 创建带ProductEditor的父ViewModel Editor_Small_ViewModel CreateProductEditor(); }
2. 实现工厂类
工厂类通过IServiceProvider从DI容器中获取所需的子ViewModel,再创建对应的父ViewModel实例:
public class EditorSmallViewModelFactory : IEditorSmallViewModelFactory { private readonly IServiceProvider _serviceProvider; public EditorSmallViewModelFactory(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; } public Editor_Small_ViewModel CreateButtonEditor() { var buttonEditor = _serviceProvider.GetRequiredService<ButtonEditor_ViewModel>(); return new Editor_Small_ViewModel(buttonEditor); } public Editor_Small_ViewModel CreateProductEditor() { var productEditor = _serviceProvider.GetRequiredService<ProductEditor_ViewModel>(); return new Editor_Small_ViewModel(productEditor); } }
3. 在DI容器中注册依赖
替换你原来两次注册Editor_Small_ViewModel的代码,改为注册子ViewModel和工厂:
// 注册子ViewModel(保持Scoped生命周期和你原来一致) services.AddScoped<ButtonEditor_ViewModel>(); services.AddScoped<ProductEditor_ViewModel>(); // 注册工厂 services.AddScoped<IEditorSmallViewModelFactory, EditorSmallViewModelFactory>();
4. 在组件/服务中使用工厂
在需要创建Editor_Small_ViewModel的地方,注入工厂并调用对应方法:
// 比如在Blazor组件中注入工厂 @inject IEditorSmallViewModelFactory EditorFactory // 用户选择按钮编辑器时 var buttonEditorVm = EditorFactory.CreateButtonEditor(); // 用户选择产品编辑器时 var productEditorVm = EditorFactory.CreateProductEditor();
可选:通用泛型工厂(扩展性更强)
如果以后需要新增更多类型的子ViewModel,可以用泛型工厂避免修改接口:
// 通用工厂接口 public interface IEditorSmallViewModelFactory { Editor_Small_ViewModel Create<TEditor>() where TEditor : class; } // 通用工厂实现 public class EditorSmallViewModelFactory : IEditorSmallViewModelFactory { private readonly IServiceProvider _serviceProvider; public EditorSmallViewModelFactory(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; } public Editor_Small_ViewModel Create<TEditor>() where TEditor : class { var editor = _serviceProvider.GetRequiredService<TEditor>(); return new Editor_Small_ViewModel(editor); } }
调用方式改为:
var buttonEditorVm = EditorFactory.Create<ButtonEditor_ViewModel>(); var productEditorVm = EditorFactory.Create<ProductEditor_ViewModel>();
这种方式新增子ViewModel时,只需要注册对应的类型即可,无需修改工厂代码。
内容的提问来源于stack exchange,提问作者User9995555
相关产品推荐
相关产品推荐

