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

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

相关推荐
zhang1338308907520 小时前
传统机械三杯式风速传感器易磨损冻堵?CG-88金属超声波风速风向传感器给出免运维方案
运维·服务器·网络·人工智能·自动化
天河归来1 天前
从原始消息到业务数据:三层数据架构的设计与实践
数据库·数据仓库·架构
meiying88381 天前
快递单号批量查询Python脚本:从手动到自动化的完整实现
开发语言·python·自动化
天远Date Lab1 天前
零信任架构实战:基于天远企业年报信息核验构建自动化商业保理财务与社保穿透评估网关
人工智能·架构·自动化
EnCi Zheng1 天前
后端怎么把AI接口稳定安全低成本接进业务:超时重试、密钥隔离与成本熔断清单
人工智能·后端·安全·架构·api
救救孩子把1 天前
LangGraph 工程化架构:类型、状态、流式通信与可观测性
架构·agent·trace·opentelemetry·langgraph·graphrag
codezzzsleep1 天前
学术汇报 PPT 自动化生成实战指南
运维·自动化·powerpoint
这个DBA有点耶1 天前
从 MySQL 到时序数据库:我帮朋友做迁移的完整记录
数据库·架构·dba
wu_solo1 天前
6.1 Transformer架构概述
深度学习·架构·transformer
张一凡931 天前
把“不要乱改”从提示词里拿出来,放进可校验的提案里
前端·后端·架构