回答网友 使用dll 封装业务逻辑

算是一种Plugin的写法了,把不同的设备或者不同的客户的处理,封装在不同Dll中,主程序不变,通过替换不同的dll文件实现个性化的业务处理。

回答网友 使用dll 封装业务逻辑_第1张图片

程序分为4个工程,BASE 是基础,其他的工程都引用BASE。 主程序是MAINAPP。另外2个是plugin 的dll。使用时,把一个或者多个plugin的dll 复制到主程序目录下,就可以。下面先看主程序的初始化。这里有个约定,就是Plugin dll 的文件名符合"Logic*.dll",另外文件名和Class的名字一致。

        private Dictionary plugin_dict = new Dictionary();
   
        private void Load_plugin()
        {
            string dir = Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName); 
            string[] ss = Directory.GetFiles(dir, "Logic*.dll");
            foreach (string fn in ss)
                load_plugin_dll(fn);
        }
        private void load_plugin_dll(string fn)
        { 
            Assembly assembly = Assembly.LoadFrom(fn);
            string s = Path.GetFileNameWithoutExtension(fn);
            string classname = s+"."+s; 
            object instance = assembly.CreateInstance(classname);
            BaseClass b = (BaseClass)instance ;
            plugin_dict[Path.GetFileName(fn)] = b;
        }

下面是在中程序里执行。

        private void button1_Click(object sender, EventArgs e)
        {
            BaseParam param = new BaseParam();
            param.ActionCode = "TEST001";
            param.Data = "啥";
            foreach (KeyValuePair kv in plugin_dict)
            {
                BaseClass plugin = kv.Value;
                if (plugin.ProcAction(param))
                    MessageBox.Show(kv.Key+"的逻辑处理: "+  param.Result);
            }
        }

下面是 BASE里的定义:

namespace BASE
{
    public class BaseClass
    {
        public virtual  bool  ProcAction(BaseParam param)
        {
            return false;
        } 
    }
}
namespace BASE
{
   public  class BaseParam
    { 
        public string ActionCode = "";
        public string Data = "";
        public string Result = "";
        public void reset_result()
        {
            Result = "";
        }
    }
}

下面是plugin的逻辑

namespace Logic01
{
    public class Logic01: BaseClass
    {
        public override bool ProcAction(BaseParam param)
        {
            if (param==null)
              return false;

            param.Result =  "Logic01的处理 ";
            return true;
        }
    }
}
namespace Logic99
{
    public class Logic99: BaseClass
    {
        public override bool ProcAction(BaseParam param)
        {
            if (param == null)
                return false;

            param.Result = "Logic99的处理 ";
            return true;
        }
    }
}

你可能感兴趣的:(前端,c#)