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

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

相关推荐
ZhouDevin1 小时前
算法论文/模型微调1——CNN架构做lora微调训练
人工智能·深度学习·算法·架构·cnn
Dr.kangder1 小时前
嵌入式处理器架构解析(七)——SPARC
架构·嵌入式·软件工程
国科安芯1 小时前
卫星星务计算机数据管理中SEU容错机制的技术实现研究——以AS32S601存储器ECC架构为例
网络·单片机·算法·fpga开发·架构·云计算·risc-v
seacracker1 小时前
HPC+AI混合负载存储碎片化严重?PowerFS Filer Raft强一致四组件统一架构一套搞定
人工智能·架构
咩咩啃树皮2 小时前
第63篇【终极整合巨作】从零手写原生中后台管理系统|整合62篇全部前端知识点|从头到尾完整架构+全功能逻辑
前端·架构
凌云拓界2 小时前
NodeVerdict:Node.js 原生诊断数据可视化工具
信息可视化·架构·typescript·开源·node.js·github·bug
得物技术3 小时前
实战从零开始构建一个Coding Agent:Violin |得物技术
javascript·架构·llm
VIP_CQCRE3 小时前
用 Ace Data Cloud 搭建自动化内容营销系统:让 AI 每天搜索热点、写文章、配图并发布
ai·自动化·内容营销·mcp·acedatacloud
数智化管理手记3 小时前
本地云数据存储算力总是不够用?云计算如何协助架构升级?
架构·云计算·github