【工业自动化平台】 工程设计-依赖注入控制反转(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插件化
  • 服务生命周期隔离

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

相关推荐
Dawson Zhu18 小时前
《Agentic Design Patterns》第 1 章导读:提示词链(Prompt Chaining)
人工智能·语言模型·架构·aigc·agi
feiyu_gao18 小时前
Mindcraft:从个人实践到可复用模式集
架构·aigc·ai编程
abigalexy18 小时前
Claude Code从零搭建新项目全流程AI实现-宠物生命周期管理App
架构·aigc·ai编程
写后端的胖头鱼19 小时前
【高频面试题】微服务项目排查错误流程(万字详解)
微服务·架构·问题定位·链路·线上排错
小小龙学IT19 小时前
Kubernetes 深度实践:架构、API 与避坑指南
容器·架构·kubernetes
MayBaymax20 小时前
MQ 基础概念与架构
java·中间件·架构·java-rocketmq
嘎嘎风20 小时前
MiniMind 学习笔记之 04 注意力之外:位置、记忆、省显存、省时间、深加工
架构·源码阅读
xiangcns20 小时前
PDMS PiplineTool(三十)一堆小优化+一个彩蛋功能
.net·二次开发·pdms
H_unique21 小时前
Chat2Excel:接口自动化测试
python·测试工具·自动化
国科安芯21 小时前
商业立方星平台中高集成度抗辐射MCU的功耗优化与批量化应用可行性探讨
单片机·嵌入式硬件·架构·risc-v·抗辐射·as32x601