首页 > 编程语言 >C# 使用反射机制适配多个不同供应商提供的可统一接口化的行为(方法)

C# 使用反射机制适配多个不同供应商提供的可统一接口化的行为(方法)

时间:2024-10-12 16:00:16浏览次数:6  
标签:return ads C# 适配 接口 int static using public

1、定义一个接口(IMedicareControlFee)定义行为;定义一个适配器(IMedicareControlFeeAdapter)可应对多厂商(多态);

using System;
using System.Diagnostics;
using System.IO;
using JetSun.Infrastructure;
using JetSun.Infrastructure.Services;
using Microsoft.Practices.Unity;
using SecuInter;

namespace JetSun.Presentation
{
    public interface IMedicareControlFeeAdapter
    {
        IMedicareControlFee GetMedicareControlFee();
    }
    
    public interface IMedicareControlFee
    {
        bool checkRulePage(object obj, ReqSceneTypeEnum reqScene);
        bool DuringHospitalizationAudit(int encounterId);
        bool Get_CheckRulePageAnticipateOutOnlyKey(int encounterid, ReqSceneTypeEnum reqScene);
        void PreCut(int encounterId);
        string SignleGroupPreview(int encounterId, out double gainLoss, out double groupPayStd);
    }
    
    public static class MedicareControlFeeHelper
    {
        public static bool IsEnabledMedicareControlFee
        {
            get
            {
                return DRJSMedicareParameter.IsUseDRJSMMedicareSystem;
            }
        }

        static IMedicareControlFee _medicareControlFee;
        public static IMedicareControlFee MedicareControlFee
        {
            get
            {
                if (_medicareControlFee == null)
                {
                    _medicareControlFee = Adapter.GetMedicareControlFee();
                }
                return _medicareControlFee;
            }
        }

        private static IMedicareControlFeeAdapter _adapter;
        private static IMedicareControlFeeAdapter Adapter
        {
            get
            {
                if (_adapter == null)
                {
                    var obj = GetDRJSAdapterInstance();
                    _adapter = (IMedicareControlFeeAdapter)Activator.CreateInstance(obj.GetType());
                }
                return _adapter;
            }
        }

        private static object GetDRJSAdapterInstance()
        {
            try
            {
                var assembly = System.Reflection.Assembly.LoadFile(AppDomainDRJS.BaseDirectory + "IHE.DRJS.MedicareControlFee.dll");
                var typeName = "IHE.DRJS.MedicareControlFee.DRJSAdapter";
                Object obj = AppDomainDRJS.CreateInstanceAndUnwrap(assembly.FullName, typeName);
                return obj;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private static AppDomain _appDomainDRJS = null;
        private static AppDomain AppDomainDRJS
        {
            get
            {
                if (_appDomainDRJS == null)
                {
                    AppDomainSetup ads = new AppDomainSetup();
                    ads.ApplicationName = "Shadow";

                    //应用程序根目录
                    ads.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;

                    //设置缓存目录
                    ads.CachePath = ads.ApplicationBase;

                    //获取或设置指示影像复制是打开还是关闭
                    ads.ShadowCopyFiles = "true";

                    //获取或设置目录的名称,这些目录包含要影像复制的程序集
                    ads.ShadowCopyDirectories = ads.ApplicationBase;
                    ads.DisallowBindingRedirects = false;
                    ads.DisallowCodeDownload = true;
                    ads.ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;

                    //Create evidence for the new application domain from evidence of
                    var adevidence = AppDomain.CurrentDomain.Evidence;

                    _appDomainDRJS = AppDomain.CreateDomain("AD #2", adevidence, ads);
                }
                return _appDomainDRJS;
            }
        }

        private class EmptyMedicareControlFee : IMedicareControlFee
        {
            public bool checkRulePage(object obj, ReqSceneTypeEnum reqScene)
            {
                return false;
            }
            public bool DuringHospitalizationAudit(int encounterId)
            {
                return false;
            }

            public bool Get_CheckRulePageAnticipateOutOnlyKey(int encounterid, ReqSceneTypeEnum reqScene)
            {
                return false;
            }

            public void PreCut(int encounterId)
            {
            }

            public string SignleGroupPreview(int encounterId, out double gainLoss, out double groupPayStd)
            {
                gainLoss = 0;
                groupPayStd = 0;
                return "";
            }
        }
    }
}

2、实现其中一个厂商(程序集IHE.DRJS.MedicareControlFee.dll),定义一个可序列化的类实现上面定义的适配器接口(多态)

using JetSun.Infrastructure;
using System;

namespace IHE.DRJS.MedicareControlFee
{
    [Serializable]
    public class DRJSAdapter : IMedicareControlFeeAdapter
    {
        public IMedicareControlFee GetMedicareControlFee()
        {
            return DRJSMedicareControlFee.Instance;
        }
    }
}

3、调用场景(应用):

double gainLoss;
double groupPayStd;
string code = MedicareControlFeeHelper.MedicareControlFee.SignleGroupPreview(1234, out gainLoss, out groupPayStd);

 

标签:return,ads,C#,适配,接口,int,static,using,public
From: https://www.cnblogs.com/chriskwok/p/18460722

相关文章

  • CF1746F Kazaee(随机化哈希)
    真的做不来这种题怎么办/ll题意给定\(n\)个数,\(q\)次操作:单点修改一个数的值。查询区间内所有数的出现次数是否均为\(k\)的倍数。\(n,q\le3\times10^5\)。分析一眼看上去只能带修莫队,而且常数还巨大无比。这种随机化哈希题一般是考虑一个必要不充分条件,但是充分的......
  • gost socks5代理
    购买云主机开放所有tcp端口配置云主机https://mirrors.tuna.tsinghua.edu.cn/elrepo/kernel/el8/x86_64/选择清华镜像源[[email protected]]#cat>>/etc/yum.repos.d/elrepo.repo<<q[elrepo]name=elrepogpgcheck=0baseurl=https://mirrors.......
  • 片状铜粉1um|片状纳米Cu粉|片状铝粉|片状锌粉|片状银粉|片状锌铝合金粉体
    片状铜粉1um|片状纳米Cu粉|片状铝粉|片状锌粉|片状银粉|片状锌铝合金粉体片状铜粉,特别是直径为1微米(μm)的颗粒,是一种具有多种应用前景的功能材料。这种材料因其独特的物理和化学性质,在多个领域中展现出重要的应用价值。以下是关于1微米片状铜粉的一些关键特性和应用:特性高......
  • 碳酸钡BaCO3微球1um
    碳酸钡BaCO3微球1um碳酸钡(BaCO₃)是一种无机化合物,通常为白色粉末,不溶于水,但溶于酸,微溶于含有二氧化碳的水。它主要用于电子陶瓷、PTC热敏电阻、MLCC电容器等多种电子元器件的制造。以下是关于碳酸钡微球(1um)的相关信息:特性1.高纯度:高质量的碳酸钡微球通常具有高纯度,这有助于......
  • 钛酸钙CaCO3纳米颗粒40nm
    钛酸钙CaCO3纳米颗粒40nm钛酸钙(CaTiO₃)实际上是一种钙钛矿结构的化合物,而不是碳酸钙(CaCO₃)。不过,假设您指的是40纳米(nm)的碳酸钙(CaCO₃)纳米颗粒,我将为您介绍这种材料的关键特性和应用。如果您的确是指钛酸钙,请告诉我,我可以提供相关的信息。碳酸钙(CaCO₃)纳米颗粒40nm特性高比......
  • C# ListToDataTable
    publicstaticDataTableListToDataTable<T>(List<T>list){DataTabledt=newDataTable();//获取实体类型Typetype=typeof(T);//添加列PropertyInfo[]properties=type.G......
  • 基于FIFO使用UART实现FPGA板与PC通信
    基于FIFO使用UART实现FPGA板与PC通信1.UART简介UART(通用异步收发传输器)是一种常用的串行通信协议,广泛用于FPGA与外部设备(如PC、传感器等)之间的通信。UART通信的核心是将并行数据转换为串行数据传输,然后在接收端再将串行数据恢复为并行数据。UART协议特点:异步通信:无需时钟......
  • 软件构造,生成算式采用CSV、XML、JSON三种形式进行存储并读取。
    编写代码完成将生成的算式及习题长期保存下来,采用CSV、XML、JSON三种形式进行存储并读取。提交相关代码及运行截图。importrandomimportcsvimportjsonimportxml.etree.ElementTreeasETfromxml.domimportminidom#生成随机算式数据defgenerate_exercises(count......
  • docker入门(二)之容器命令及私有仓库的部署(本地和harbor)
    容器命令:1.启动容器接下来演示在docker下运行一个ubuntu系统,从中学习各容器命令。--name="容器新名字"为容器指定一个名称(不指定的话会随机分配一个名字)。-d:后台运行容器并返回容器ID,也就启动守护式容器(后台运行)-i:以交互模式运行容器,通常与-t同时使用-t:为......
  • P9466 [EGOI2023] Bikes vs Cars / 骑车与汽车
    题意给定\(B,C\)两个矩阵,你需要构造一张两权图\(G=(V,E=\{(u,v,w_1,w_2)\})\)使得从\(i\)到\(j\)之间:可以只经过\(w_1\geB_{i,j}\)的边连通可以只经过\(w_2\geC_{i,j}\)的边连通不能只经过\(w_1>B_{i,j}\)的边连通不能只经过\(w_2>C_{i,j}\)的边连通构......