基于Prism构建ETABS插件(.dll)无App.xaml场景的实现问题问询
ETABS类库插件接入Prism框架实现方案
Prism框架本身不强制依赖WPF应用的App.xaml入口,你可以在cPlugin的Main方法内手动完成Prism容器初始化、服务注册、视图解析的全流程,完全适配类库项目的约束。
前置准备
先通过NuGet安装以下依赖包:
- Prism.Wpf
- Prism.DryIoc(或你习惯使用的Prism容器实现,如Unity)
实现步骤
- 移除原有MainView的手动DataContext绑定代码,Prism会自动完成视图和ViewModel的关联
- 在cPlugin的Main方法内手动构建Prism容器,完成服务、视图、ViewModel的注册
- 从容器中解析出MainView实例后再显示
改造后的代码示例
CPlugin.cs
using Combonito.Views; using CSiAPIv1; using Prism.DryIoc; using Prism.Ioc; using System; using System.Windows; namespace Combonito { public class cPlugin { private MainView _MyForm; // 存储ETABS上下文对象,用于注册到Prism容器 private cSapModel _sapModel; private cPluginCallback _sapPlugin; public void Main(ref cSapModel _SapModel, ref cPluginCallback _ISapPlugin) { _sapModel = _SapModel; _sapPlugin = _ISapPlugin; try { // 手动初始化Prism容器 var app = new PrismApplicationBuilder() .UseDryIoc() .ConfigureServices(RegisterServices) .ConfigureRegionAdapterMappings(_ => { // 如果用到Region功能,在这里配置区域适配器,不需要可以省略 }) .Build(); // 从容器解析MainView,Prism会自动绑定对应ViewModel _MyForm = app.Container.Resolve<MainView>(); _MyForm.ShowDialog(); // 窗口关闭后调用ETABS要求的Finish方法 _sapPlugin.Finish(0); } catch (Exception ex) { try { _sapPlugin.Finish(1); Console.WriteLine(ex); } catch (Exception ex1) { Console.WriteLine(ex1); throw; } } } // 注册所有服务、视图、ViewModel private void RegisterServices(IContainerRegistry containerRegistry) { // 注册ETABS上下文对象,方便在ViewModel中注入使用 containerRegistry.RegisterInstance(_sapModel); containerRegistry.RegisterInstance(_sapPlugin); // 注册视图和ViewModel的关联,用ViewModelLocator自动绑定 containerRegistry.RegisterForNavigation<MainView, MainWindowViewModel>(); // 其他你需要用到的服务都在这里注册 // containerRegistry.Register<IMyService, MyService>(); } public int Info(ref string txt) { try { txt = "你的插件说明"; } catch (Exception ex) { Console.WriteLine(ex); throw; } return 0; } ~cPlugin() { Console.WriteLine(GC.GetGeneration(0)); } } }
关键说明
- 如果你的Prism版本没有PrismApplicationBuilder,可以改用老式的Bootstrapper写法,原理一致:自定义DryIocBootstrapper子类,重写ConfigureContainer、RegisterTypes等方法,然后在Main方法里调用Bootstrapper.Run()即可
- 不需要对MainView做额外改动,只要保证ViewModel的命名符合Prism的ViewModelLocator默认规则(View在Views目录,ViewModel在ViewModels目录,名称为XXXViewModel对应XXXView),或者手动指定关联
- Prism的事件聚合器、导航、对话框服务等功能都可以正常使用,所有需要用到的组件提前在RegisterServices中注册即可
内容的提问来源于stack exchange,提问作者user15798960
相关产品推荐
相关产品推荐

