📸 Prism 架构中如何优雅地注册和注入相机服务
在开发基于 Prism + WPF 的应用时,合理使用依赖注入(DI)可以大大提高系统的可维护性和扩展性。本文以一个多相机平台管理系统为例,展示如何通过接口、枚举、容器注册等方式,实现相机服务的灵活配置与使用。
🧩 一、定义枚举:支持多种相机类型
在实际项目中,我们可能会支持多种相机品牌。通过定义 CameraType
枚举,清晰地管理支持的相机类型。
public enum CameraType
{
MindVision,
Daheng,
Hikvision
}
该枚举可用于服务注册和动态调用,避免硬编码字符串,提升代码可读性与安全性。
🔧 二、定义参数类:封装通用参数结构
为了统一设置相机参数,我们创建了一个 CameraParameter
类,用于封装曝光和增益设置:
public class CameraParameter
{
public double Exp { get; set; }
public double Gain { get; set; }
}
这样不仅便于维护,也为后续扩展其他参数(如帧率、分辨率等)打下基础。
🔌 三、定义接口:统一不同厂商相机的调用规范
接口 ICameraService
规范了所有相机服务的基本操作:
internal interface ICameraService
{
void Connect();
void Start();
void Stop();
void Snap();
void Close();
}
各厂商相机只需实现该接口即可接入系统,真正实现“面向接口编程”。
🧱 四、注册服务:绑定接口与具体实现
在 Prism 框架中,服务需要注册到依赖注入容器中。在 App.xaml.cs
中重写 RegisterTypes
方法:
protected override void RegisterTypes(IContainerRegistry services)
{
services.Register<ICameraService, MindVisionService>(nameof(CameraType.MindVision));
}
这里使用了命名注册,绑定 CameraType.MindVision
到 MindVisionService
,从而在需要时按需解析对应服务。
💉 五、解析服务:按需注入具体实现
在 MainWindow
构造函数中,通过 ContainerLocator.Container.Resolve
解析接口:
cameraService = ContainerLocator.Container.Resolve<ICameraService>(nameof(CameraType.MindVision));
这段代码表示:从容器中解析出与 CameraType.MindVision
对应的服务,并赋值给 cameraService
字段,后续通过该字段统一操作相机。
🧪 六、类成员注入与使用
注入后的 ICameraService
实例被保存为私有只读字段:
private readonly ICameraService cameraService;
后续可通过 cameraService.Connect()
等方法进行操作,而无需关心其实际类型是否是 MindVisionService
、DahengService
或 HikvisionService
。
✅ 七、总结
通过这套架构设计,我们实现了:
- ✅ 多厂商支持:新增相机只需实现
ICameraService
并注册容器; - ✅ 代码解耦:业务层依赖接口而非具体实现;
- ✅ 易于扩展:注册与注入机制灵活可控。
📌 提示:实际项目中还可结合配置文件选择具体相机类型,实现运行时的服务切换,更进一步提升系统的灵活性。
如果你也在使用 Prism 进行模块化开发,不妨尝试这种方式来管理你的设备驱动服务!