You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 19:43:41