结合场景(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插件化
- 服务生命周期隔离
非常适合工业上位机平台。