【Prism】 实现注入的几个标准化步骤(相机举例)

发布于:2025-06-20 ⋅ 阅读:(19) ⋅ 点赞:(0)

📸 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.MindVisionMindVisionService,从而在需要时按需解析对应服务。


💉 五、解析服务:按需注入具体实现

MainWindow 构造函数中,通过 ContainerLocator.Container.Resolve 解析接口:

cameraService = ContainerLocator.Container.Resolve<ICameraService>(nameof(CameraType.MindVision));

这段代码表示:从容器中解析出与 CameraType.MindVision 对应的服务,并赋值给 cameraService 字段,后续通过该字段统一操作相机。


🧪 六、类成员注入与使用

注入后的 ICameraService 实例被保存为私有只读字段:

private readonly ICameraService cameraService;

后续可通过 cameraService.Connect() 等方法进行操作,而无需关心其实际类型是否是 MindVisionServiceDahengServiceHikvisionService


✅ 七、总结

通过这套架构设计,我们实现了:

  • 多厂商支持:新增相机只需实现 ICameraService 并注册容器;
  • 代码解耦:业务层依赖接口而非具体实现;
  • 易于扩展:注册与注入机制灵活可控。

📌 提示:实际项目中还可结合配置文件选择具体相机类型,实现运行时的服务切换,更进一步提升系统的灵活性。

如果你也在使用 Prism 进行模块化开发,不妨尝试这种方式来管理你的设备驱动服务!


网站公告

今日签到

点亮在社区的每一天
去签到