Revit中使用依赖注入

依赖注入的技术已经很成熟,本文主要是说明一下Revit中的适用版本与介绍相关的开源项目。

版本问题

版本

目前的依赖注入包无法支持Revit 2020 以下的版本,原因是因为包中的依赖项与Revit本身的依赖项不一致导致的,所以说如果使用Revit + DI 进行开发需要再2020以上 。 如果有其他方式可以通过评论介绍一下,一起交流。

原因

因为我常用版本在2019 , 在我使用DI时引用了Microsoft.Extensions.Hosting这个包开发,但是每次开发都是报错,开始时我认为是我的开发引用与这个包内部依赖项冲突,所以单独做了项目进行引用,但是依旧报错,但是更换版本在Revit 2021 可以正常使用,所以怀疑Revit本身加载的依赖项与这个包发生冲突。
在这里插入图片描述

于是搜索资料,发现相关的资料很少,在网络上使用Revit + DI 的资料也相对较少,这里找到一个资料中间讲了这个事情,与我的预估基本一致,jimmy在下面回复也是需要通过复杂的方式(IPC)桥接。

How to force a host application to load a .Net addin’s version of transitive dependencies

Revit +DI

依赖注入的讲解与视频网络上面很多,这里提供两个网址一个是开源项目一个是原理讲解,需要的可以看一下

依赖注入 - 看这篇就够了
RevitLookup

RevitLookUp在2020之后与另一位开源作者Nice3point合作,将框架更改为DI,所以需要学习的可以直接下载这个文件下来自己学习使用。


说一下我现在应用方向,因为目前2020以上的版本开发较少,所以可能会理解错误,但是暂时记录现在后续再逐渐扩充。
假设每个方法都是X_Command , 如果我们自己的插件功能数量超过20个,可能我们会自己集成一套自己的Tool方便开发,基于此,如果直接测试插件功能可能会面临频繁的启动Revit或者我们单独创建一个项目将代码copy过去测试,完成后再copy回去,这种方式的效率会比较慢。
如果我们自己创建一个接口,所有的command主要代码继承这个接口,我们只需要做一个测试项目,使用依赖注入加载这个方法从而测试会更加方便。

在这里插入图片描述
Core_Di_Test作为Revit所有功能的项目,里面仅有操作部分的代码不涉及Application 与 Command,
让每一个想要编写的功能均继承基础的接口

namespace Core_Di_Test
{public class Class1:IWorkInterface{public void Start(){TaskDialog.Show("A", "M");}}public interface IWorkInterface{void Start();}
}

测试文件 , UI 文件或是其他应用场景

public class Class1:IExternalCommand
{public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements){// TaskDialog.Show("A", "n");RevitApi.UiApplication = Context.UiApplication;//var host = Host.CreateDefaultBuilder();var host = Host.CreateDefaultBuilder().ConfigureServices(build =>{//build.AddSingleton<IExtensionCommand, ReadFamilyParameter>();build.AddTransient<IWorkInterface, Class1>();}).Build();host.Services.GetService<IExtensionCommand>().Start();//TT.Test(commandData.Application.ActiveUIDocument.Document);return Result.Succeeded;}
}

这样就可以将功能的主要代码与测试,UI,部署分离,从而减少代码之间的耦合度,增加我们的开发效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/442648.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python __call__方法(详解版)

我们用 hasattr() 函数判断指定属性&#xff08;或方法&#xff09;是否存在&#xff0c;但到底是属性还是方法&#xff0c;则需要进一步判断它是否可调用。程序可通过判断该属性&#xff08;或方法&#xff09;是否包含 __call__ 属性来确定它是否可调用。 例如如下程序&#…

计算机设计大赛 垃圾邮件(短信)分类算法实现 机器学习 深度学习

文章目录 0 前言2 垃圾短信/邮件 分类算法 原理2.1 常用的分类器 - 贝叶斯分类器 3 数据集介绍4 数据预处理5 特征提取6 训练分类器7 综合测试结果8 其他模型方法9 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 垃圾邮件(短信)分类算…

Java技术栈 —— Spring MVC 与 Spring Boot

参考文章或视频链接[1] Spring vs. Spring Boot vs. Spring MVC[2] Key Differences Between Spring vs Spring Boot vs Spring MVC

C# Onnx yolov8 水表读数检测

目录 效果 模型信息 项目 代码 训练数据 下载 C# Onnx yolov8 水表读数检测 效果 模型信息 Model Properties ------------------------- date&#xff1a;2024-01-31T10:18:10.141465 author&#xff1a;Ultralytics task&#xff1a;detect license&#xff1a;AGPL-…

【C++】类和对象(二)——构造/析构/拷贝构造函数

&#x1f497;个人主页&#x1f497; ⭐个人专栏——C学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 目录 导读1. 默认成员函数2. 构造函数2.1 引入2.2 特性2.3 默认构造函数 3. 析构函数3.1 概念3.2 特性3.3 默认析构函数 4. 拷贝构造函…

C语言------函数

C语言的两个重要关键字&#xff1a;static&&extern 会报错&#xff0c;是a未定义&#xff0c;说明局部变量a只能够在内部的括号里面使用&#xff1b; 如果a是全局变量&#xff0c;那么a就全部可以使用&#xff1b; 在不同的文件中&#xff0c;如果想要使用的某个变量没…

万户 ezOFFICE DocumentEdit_unite.jsp SQL注入漏洞复现

0x01 产品简介 万户OA ezoffice是万户网络协同办公产品多年来一直将主要精力致力于中高端市场的一款OA协同办公软件产品,统一的基础管理平台,实现用户数据统一管理、权限统一分配、身份统一认证。统一规划门户网站群和协同办公平台,将外网信息维护、客户服务、互动交流和日…

【Java-JDK】JDK 的安装与环境变量的配置:Windows Linux

【Java-JDK】JDK的安装与环境变量的配置&#xff1a;Windows & Linux 1&#xff09;Windows安装JDK1.1.下载JDK1.1.安装JDK1.2.JDK环境配置1.3.验证环境变量是否配置成功 2&#xff09;Linux安装JDK2.1.下载JDK2.2.安装JDK2.3.JDK环境配置2.4.验证环境变量配置是否成功 1&a…

如何有效避免市场恐慌性抛售?

布雷特斯坦伯格是一位备受尊敬的交易心理导师&#xff0c;曾担任华尔街多家顶级培训机构的心理导师&#xff0c;指导交易员们如何应对心理挑战。作为一名心理学教授和资深交易员&#xff0c;他对交易心理的理解远超常人。人们普遍认为&#xff0c;要想在交易领域取得成功&#…

Zynq UltraScale+使用记录-----配置和程序固化

新手使用记录 芯片&#xff1a;xczu3eg-sfvc784-2-i 开发板&#xff1a;米联客8X-3EG &#xff08;B&#xff09; 开发环境&#xff1a;vavido2019.2 1. create block design 主要配置了UART0&#xff08;输出信息&#xff09;\SD1&#xff08;SD卡启动&#xff09;\BANK电平\…

qt学习:Table widget控件

目录 头文件 实战 重新配置ui界面 添加头文件 在构造函数中添加初始化 显示方法 该实例是在sqlite项目上添加qt学习&#xff1a;QTSQL连接sqlite数据库增删改查-CSDN博客 头文件 #include <QTableWidgetItem> 实战 重新配置ui界面 用法介绍&#xff0c;可以双击…

Redis核心技术与实战【学习笔记】 - 7.Redis GEO类型 - 面向 LBS 应用的数据类型

前言 前面&#xff0c;介绍了 Redis 的 5 大基本数据类型&#xff1a;String、List、Hash、Set、Sorted Set&#xff0c;它们可以满足绝大多数的数据存储需求&#xff0c;但是在面对海里数据统计时&#xff0c;它们的内存开销很大。所以对于一些特殊的场景&#xff0c;它们是无…