初识插件式软件开发

  在看本文章之前,需了解 反射技术 和面向对象基本思想!

当业务需求不断变化, 为了项目更好的扩展,我们便需要一种可以动态加载的技术。

 实现插件式开发主要分为3步
    1 定义接口
    2 加载插件
    3 编写插件

实例程序

步骤1 :
创建一个类库项目,取名为Plguin

    创建一个接口IPlugin
using System;
using System.Collections.Generic;

namespace Plguin
{

  public  enum Function
   {
       Text=0, //文本值
       Bool=1  //bool值
   }
   public interface IPlugin
   {
       public String GetName();

       /// <summary>
       /// 获取一个功能列表
       /// </summary>
       /// <returns></returns>
       public Function[] GetFunction();
       
       /// <summary>
       /// 执行
       /// </summary>
       public void Execute(List<String> val);
   }
   
}

步骤2 在程序中加载dll

1 在项目中创建一个plugin 文件夹 用来保存插件
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Reflection;
using System.Threading.Channels;
using Plguin;

namespace IotPlugin
{
    class Program
    {
        static void Main(string[] args)
        {     
            IotStart start=new IotStart();
            start.Start();
        }
    }

    class IotStart
    {
        public IotStart()
        {
            loadPlugin();
        }
        public Dictionary<String,IPlugin> ListName=new Dictionary<String,IPlugin>();
        public void loadPlugin()
        {
String fileName = "../../../Plugin/";
             // 获取所有文件

DirectoryInfo info=new DirectoryInfo(fileName);
            FileInfo[] files=info.GetFiles();
            for (int i = 0; i < files.Length; i++)
{
               Assembly assembly= Assembly.LoadFile(files[i].FullName);
 //   创建实例
                 IPlugin plugin= assembly.CreateInstance(assembly.GetName().Name+"."+assembly.GetTypes()[0].Name) as  IPlugin;if (plugin==null)
                {
                    throw  new Exception("插件错误请检查插件!!!!");
                    
                }
                ListName.Add(plugin.GetName(),plugin);
            }
        }
        public void Start()
        {
            Console.WriteLine("-==================按键选择========================================");
            Console.WriteLine("1--请选择设备");
            Console.WriteLine("2--刷新插件");
            int switchVal =int.Parse(Console.ReadLine());
            switch (switchVal)
            {                
               case 1: Swich();
                   break;
               case 2 :
                   loadPlugin();
                   break;;
            }
            
        }

        public void Swich()
        {
            Console.WriteLine("输入名称选择设备");
            foreach (var VARIABLE in ListName.Keys)
            {
                Console.WriteLine($"----{VARIABLE}");
            }
            ShowList(Console.ReadLine());
        }

        public void ShowList(String val)
        {
            List<String> list=new List<string>();
            IPlugin plugin = ListName[val];
            foreach (var VARIABLE in plugin.GetFunction())
            {
                Console.WriteLine("请输入值:");
                list.Add(Console.ReadLine()); 
            }
            plugin.Execute(list);

        }
        
        
    }
}

3 编写一个插件
注意!每一个插件都应该是一个单独的程序集 并且需要引用plugin 程序集

using System;
using System.Collections.Generic;
using Plguin;

namespace XiaoMiPlguin
{
    public class XiaoMiPlguin: IPlugin
    {
        public string GetName()
        {
            return "设备1";
        }
        public Function[] GetFunction()
        {
            Function[] func = new[]
            {
                Function.Text,
                Function.Text
            };
            return func;
        }

        public void Execute(List<string> val)
        {Dictionary<String,String> dic=new Dictionary<String,String>();
            dic.Add("F2_temper","");
            dic.Add("F3_temper","");
            if (val.Count!=dic.Count)
            {
                throw  new Exception("参数长度错误");
            }
            int index = 0;
            foreach (String key in dic.Keys)
            {
                if (val[index]=="")
                {
                    continue;
                }
                dic[key] = val[index];
                index += 1;
            }

            {
                Console.WriteLine("正在发生请求==========================");
                //模拟发生请求的过程
                foreach (var VARIABLE in dic.Keys)
                {
                    Console.WriteLine(VARIABLE+":"+dic[VARIABLE]);
                }
                Console.WriteLine("请求发生成功=========================");

            }
        }

   
    }
 
}

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AUTOSAR底层软件开发是指在汽车软件开发中,根据AUTOSAR标准规范进行底层软件的设计和实现。AUTOSAR的目的是为了提供一套优秀的底层代码库,使汽车制造商在开发上层应用层软件时不需要考虑下层不同ECU型号的差异,以达到软件开发的标准化、规范化、安全化、快速化和经济化的目标。为了实现这一目标,AUTOSAR将不同型号的ECU封装起来,对外提供统一的接口供上层软件调用,而BSW(Basic Software)则是起到这个作用的组件。底层软件开发涉及到多个方面,包括arxml、RTE生成和BSW配置代码、BSW静态代码、MCAL配置代码、MCAL静态代码等。123 #### 引用[.reference_title] - *1* *3* [autosar学习 --初识](https://blog.csdn.net/weixin_40297883/article/details/127151377)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] - *2* [【车载开发系列】AutoSar架构之基础软件层BSW](https://blog.csdn.net/Last_Impression/article/details/130592607)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值