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

如何在遗留ASP.NET 4.7.2项目中结合Unity使用MediatR?

可行方案:在.NET 4.7.2遗留ASP.NET应用中结合Unity与MediatR

1. 安装兼容的NuGet包

由于你的项目基于.NET 4.7.2且使用Unity 4.x/5.x,需安装适配版本的MediatR及Unity集成包:

  • MediatR v9.0.0(完全支持.NET 4.7.2,兼容旧版Unity)
  • MediatR.Unity v9.0.0(官方提供的Unity容器集成扩展)

2. 修改Unity容器注册代码

在Global.asax.cs的Application_Start方法中,添加MediatR相关类型的注册,完整代码如下:

public class Global : System.Web.HttpApplication
{
    public void Application_Start(object sender, EventArgs e)
    {
        IdentityModelEventSource.ShowPII = true;

        // 初始化Unity容器
        var diContainer = this.AddUnity();

        // 保留原有依赖注册代码
        diContainer.RegisterType<MyServices>(new TransientLifetimeManager());
        diContainer.RegisterType<IUnitOfWork, UnitOfWork>(new TransientLifetimeManager());
        diContainer.RegisterType<MapperConfig>(new ContainerControlledLifetimeManager());
        diContainer.RegisterType<DashboardService>(new TransientLifetimeManager());
        diContainer.RegisterType<UserVisitsService>(new TransientLifetimeManager());

        diContainer.RegisterType<MyBasePage>(new InjectionConstructor(diContainer.Resolve<MyServices>()));
        diContainer.RegisterType<UnifiedSite>(new InjectionConstructor(typeof(MyServices), typeof(NavigationService)));

        diContainer.RegisterType<Controllers.DashboardController>(new InjectionConstructor(diContainer.Resolve<DashboardService>()));
        diContainer.RegisterType<Controllers.FeedbackController>(new InjectionConstructor(diContainer.Resolve<IUnitOfWork>()));
        diContainer.RegisterType<Controllers.UserVisitsController>(new InjectionConstructor(diContainer.Resolve<UserVisitsService>()));

        // --- 新增MediatR注册逻辑 ---
        // 注册IMediator的实现类
        diContainer.RegisterType<IMediator, Mediator>();

        // 批量扫描并注册所有IRequestHandler、INotificationHandler(当前程序集)
        diContainer.RegisterTypes(
            AllClasses.FromAssemblies(typeof(Global).Assembly),
            WithMappings.FromAllInterfaces,
            WithName.Default,
            WithLifetime.Transient
        );

        // 注册MediatR内部依赖的ServiceFactory
        diContainer.RegisterInstance<ServiceFactory>(type => diContainer.Resolve(type));

        // 保持Web API依赖Resolver设置
        GlobalConfiguration.Configuration.DependencyResolver = new UnityIoCContainer(diContainer);
    }
}

3. 使用示例

在Web API控制器中注入并使用MediatR

public class DashboardController : ApiController
{
    private readonly IMediator _mediator;

    // 通过构造函数注入IMediator
    public DashboardController(IMediator mediator)
    {
        _mediator = mediator;
    }

    public async Task<IHttpActionResult> GetDashboardData()
    {
        // 发送查询请求
        var query = new GetDashboardDataQuery();
        var result = await _mediator.Send(query);
        
        return Ok(result);
    }
}

示例Query与Handler定义

// 查询请求定义
public class GetDashboardDataQuery : IRequest<DashboardDataDto>
{
    // 可添加查询参数,如用户ID、时间范围等
}

// 查询处理器实现
public class GetDashboardDataQueryHandler : IRequestHandler<GetDashboardDataQuery, DashboardDataDto>
{
    private readonly DashboardService _dashboardService;

    public GetDashboardDataQueryHandler(DashboardService dashboardService)
    {
        _dashboardService = dashboardService;
    }

    public Task<DashboardDataDto> Handle(GetDashboardDataQuery request, CancellationToken cancellationToken)
    {
        // 复用原有业务逻辑获取数据
        var stats = _dashboardService.GetDashboardStats();
        // 转换为DTO返回
        return Task.FromResult(new DashboardDataDto 
        { 
            TotalVisits = stats.TotalVisits,
            RecentUsers = stats.RecentUsers
        });
    }
}

public class DashboardDataDto
{
    public int TotalVisits { get; set; }
    public int RecentUsers { get; set; }
}

注意事项

  • 若Handler分布在多个程序集,需将对应程序集传入AllClasses.FromAssemblies(...)方法中。
  • 若不想使用MediatR.Unity包,可手动注册每个Handler类型,但批量扫描更高效。
  • 若遇到Unity版本兼容问题,可替换批量注册逻辑为逐个注册Handler,例如:diContainer.RegisterType<IRequestHandler<GetDashboardDataQuery, DashboardDataDto>, GetDashboardDataQueryHandler>()。

内容的提问来源于stack exchange,提问作者Mahesh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 15:17:18