如何在遗留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集成包:
MediatRv9.0.0(完全支持.NET 4.7.2,兼容旧版Unity)MediatR.Unityv9.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
相关产品推荐
相关产品推荐

