【工业自动化平台】 工程设计-依赖注入控制反转(2)

结合场景(Host + WPF + 动态插件 + PLC/SECS/GEM设备实例 + EventBus ),Autofac 子容器推荐采用 Root Container + Plugin LifetimeScope 架构。

核心思想:

Root Container 管平台级服务;每个插件/设备创建一个独立 LifetimeScope,管理自己的服务和资源。


1. 总体架构

text 复制代码
                Host.exe
                   |
                   |
          Autofac Root Container
             (IContainer)
                   |
     +-------------+--------------+
     |             |              |
  Logger        EventBus     Configuration
  SQLite        MessageBus   SystemService


                   |
              PluginManager
                   |
        BeginLifetimeScope()
                   |
     +-------------+--------------+
     |                            |
 DeviceA Scope               DeviceB Scope
 (ILifetimeScope)            (ILifetimeScope)

     |                            |
 DeviceA Service              DeviceB Service
 PLC Driver                   PLC Driver
 SECS Driver                  SECS Driver
 Alarm                        Vision
 Recipe                       Recipe

2. 项目分层设计

推荐:

复制代码
Platform
│
├── Platform.Core
│      │
│      ├── IServiceContainer
│      ├── IPlugin
│      ├── IPluginManager
│      ├── IEventBus
│      └── DTO
│
├── Platform.Application
│      │
│      ├── DeviceManager
│      └── PluginApplicationService
│
├── Platform.Infrastructure
│      │
│      ├── Autofac
│      │      ├── AutofacServiceContainer
│      │      └── PluginLifetimeManager
│      │
│      ├── SQLite
│      ├── Logging
│      └── Communication
│
├── Platform.Host
│      │
│      └── Program.cs
│
├── Platform.UI.WPF
│      │
│      ├── View
│      ├── ViewModel
│      └── UIService
│
└── Plugins
       |
       ├── Siemens.Plugin
       |
       ├── SecsGem.Plugin
       |
       └── Vision.Plugin

3. Root Container设计

Host启动:

csharp 复制代码
var builder = new ContainerBuilder();


// 平台服务

builder.RegisterType<EventBus>()
       .As<IEventBus>()
       .SingleInstance();


builder.RegisterType<Logger>()
       .As<ILogger>()
       .SingleInstance();


builder.RegisterType<PluginManager>()
       .As<IPluginManager>()
       .SingleInstance();


var container = builder.Build();

Root负责:

复制代码
生命周期:
Application级

对象:
Logger
EventBus
配置
数据库
插件管理器

4. PluginManager设计

不要暴露 Autofac:

接口:

csharp 复制代码
public interface IPluginManager
{

    void Load(string path);


    void Unload(string name);

}

实现:

csharp 复制代码
public class AutofacPluginManager 
    : IPluginManager
{

    private readonly ILifetimeScope _root;


    private readonly Dictionary<string,ILifetimeScope>
        _scopes = new();


    public AutofacPluginManager(
        ILifetimeScope root)
    {
        _root=root;
    }


    public void Load(string path)
    {

        var assembly =
            Assembly.LoadFrom(path);


        var scope =
        _root.BeginLifetimeScope(
        builder =>
        {

            builder.RegisterAssemblyModules(
                assembly);

        });


        _scopes[path]=scope;

    }


    public void Unload(string path)
    {

        if(_scopes.TryGetValue(path,out var scope))
        {
            scope.Dispose();

            _scopes.Remove(path);
        }

    }

}

5. 插件注册方式

插件:

复制代码
Siemens.Plugin.dll

定义:

csharp 复制代码
public class SiemensModule 
        : Module
{

protected override void Load(
ContainerBuilder builder)
{

    builder.RegisterType<SiemensDriver>()
           .As<IPlcDriver>()
           .SingleInstance();


    builder.RegisterType<DeviceService>()
           .As<IDeviceService>()
           .SingleInstance();

}

}

加载:

csharp 复制代码
builder.RegisterAssemblyModules(
    assembly);

自动注册:

复制代码
DeviceService
SiemensDriver
AlarmService
RecipeService

6. 子容器服务依赖父容器

例如:

csharp 复制代码
public class DeviceService
{

private readonly ILogger _logger;

private readonly IEventBus _bus;


public DeviceService(
 ILogger logger,
 IEventBus bus)
{

}

}

解析:

复制代码
DeviceScope

DeviceService
       |
       |
       + ILogger
       |
       + EventBus


没有

向Root找

结果:

复制代码
Root Logger
Root EventBus

注入成功

7. 多设备实例设计

例如两个PLC:

text 复制代码
Root


Device001 Scope

 PLC Driver
 DeviceService


Device002 Scope

 PLC Driver
 DeviceService

代码:

csharp 复制代码
var device1 =
root.BeginLifetimeScope(builder =>
{
    builder.RegisterType<SiemensDriver>()
    .As<IPlcDriver>();
});


var device2 =
root.BeginLifetimeScope(builder =>
{
    builder.RegisterType<SiemensDriver>()
    .As<IPlcDriver>();
});

结果:

复制代码
device1 PlcDriver != device2 PlcDriver

每个设备独立:

  • TCP连接
  • 状态
  • Alarm
  • Thread
  • Timer

8. 生命周期设计

推荐:

对象 Scope 生命周期
ILogger Root SingleInstance
EventBus Root SingleInstance
Configuration Root SingleInstance
PluginManager Root SingleInstance
PLC Driver Device Scope SingleInstance
SECS Driver Device Scope SingleInstance
DeviceService Device Scope SingleInstance
ViewModel UI Scope InstancePerDependency

9. WPF结合

不要:

复制代码
WPF
 |
 Autofac Container

推荐:

复制代码
Host

Root Container

       |
       |
    UIService

       |
       |
 WPF MainWindow

注册:

csharp 复制代码
builder.RegisterType<WpfUIService>()
.As<IUIService>();

启动:

csharp 复制代码
var ui =
container.Resolve<IUIService>();

ui.ShowMainWindow();

10. 不暴露Autofac

最终依赖:

复制代码
业务插件

    |
    |
 Platform.Core


Platform.Infrastructure

    |
    |
 Autofac

插件不知道:

复制代码
Autofac
IContainer
ILifetimeScope

推荐最终模型

复制代码
                Host

          Autofac Root
          IContainer

              |
              |
       PluginManager

              |
    +---------+----------+
    |                    |

Device Scope          Device Scope

ILifetimeScope        ILifetimeScope

PLC                  SECS/GEM
Vision               Recipe
Alarm                Service

这个架构可以支持:

  • 动态加载 DLL
  • 动态卸载设备
  • 多设备并行
  • WPF/WinForms切换
  • PLC/SECS/GEM插件化
  • 服务生命周期隔离

非常适合工业上位机平台。

相关推荐
qq_426003962 分钟前
【UI自动化测试】UI自动化报错解决方案
运维·ui·自动化
网安蟹佬霸21 分钟前
WAF绕过技术实战:从规则检测到编码绕过全指南(2026最新版,附Payload集与自动化脚本)
运维·安全·网络安全·架构·自动化·网安
国科安芯1 小时前
轨道供电韧性:ASP4644四通道降压架构在低轨卫星平台电源管理中的适用性分析
运维·网络·数据库·嵌入式硬件·架构·状态模式·低轨卫星星座
Python自动化直播2 小时前
周末测试直播自动化时,发现一个棘手的并发问题
运维·自动化
云上工程笔记2 小时前
RDMA 高速互联 GPU 云怎么选:多卡训练、分布式训练与 RoCE/InfiniBand 架构对比
架构·云计算·gpu算力
画中有画3 小时前
自动化脚本中系统事件和回调函数
运维·自动化
FII工业富联科技服务3 小时前
WRC 2026技术拆解:从人类示范到真机反馈,机器人“大脑”如何完成训练闭环?
人工智能·机器人·自动化·制造
这个DBA有点耶3 小时前
GaussDB和金仓KingbaseES本质差异:技术路线、Oracle兼容度、适用场景全解析
数据库·oracle·架构
Python私教3 小时前
软件开发报价差 3 倍,真正的工程冲突不在价格
后端·架构