0

我正在尝试准备我的应用程序代码以接受第三方的年度更改wsdl。我无法制作也无法控制它的设计wsdl。其中的对象wsdl可能会更改、添加项目、删除项目等。但是,我仍然需要保留wsdl.

我的计划是添加当前wsdl作为服务参考,就像我对以前的wsdl.

目前,我有多种类似于下面的方法(包括下面的一种)。

使用属性TaxYear来确定wsdl实际引用哪个:“Service2015”或“Service2016”。我传入表示来自 的对象的通用对象wsdl,并传入ref我在父方法中使用的那些对象的参数。

像这样重构,会造成很多膨胀,我不禁认为必须有更好的方法来做我想做的事情。

有没有更好的方法使用 C# 来做这件事,或者这是做我需要完成的最好和最不方便的方法。

private static void RetrieveRequestObject(ref object objRequest, object objBusinessHeader, object objSecurityHeader, object objManifestHeader, object objFormData)
{
    if (TaxYear.Equals(2015))
    {
        objRequest = new Service2015.BulkRequestTransmitterRequest()
        {
            ACABusinessHeader = (Service2015.ACABulkBusinessHeaderRequestType)objBusinessHeader,
            Security = (Service2015.SecurityHeaderType)objSecurityHeader,
            ACATransmitterManifestReqDtl = (Service2015.ACATrnsmtManifestReqDtlType)objManifestHeader,
            ACABulkRequestTransmitter = (Service2015.ACABulkRequestTransmitterType)objFormData
        };
    }
    else if (TaxYear.Equals(2016))
    {
        objRequest = new Service2016.BulkRequestTransmitterRequest()
        {
            ACABusinessHeader = (Service2016.ACABulkBusinessHeaderRequestType)objBusinessHeader,
            Security = (Service2016.SecurityHeaderType)objSecurityHeader,
            ACATransmitterManifestReqDtl = (Service2016.ACATrnsmtManifestReqDtlType)objManifestHeader,
            ACABulkRequestTransmitter = (Service2016.ACABulkRequestTransmitterType)objFormData
        };
    }
}
4

2 回答 2

0

尝试使用反射做这样的事情。

例子:

namespace Stackoverflow
{
    class Program
    {
        static void Main(string[] args)
        {
            int objBusinessHeader = 1,
            objSecurityHeader = 2,
            objManifestHeader = 3,
            objFormData = 4;

            var obj = (IService)RetrieveRequestObject(2010, objBusinessHeader,
                objSecurityHeader,
                objManifestHeader,
                objFormData);

            Console.WriteLine(obj.GetValues());


            var obj2 = (IService)RetrieveRequestObject(2011, objBusinessHeader,
                objSecurityHeader,
                objManifestHeader,
                objFormData);

            Console.WriteLine(obj2.GetValues());

            Console.ReadKey();
        }

        private static object RetrieveRequestObject(int taxYear, object objBusinessHeader,
            object objSecurityHeader, object objManifestHeader, object objFormData)
        {
            var serviceInstance = Activator.CreateInstance("Stackoverflow",
                "Stackoverflow.Service" + taxYear).Unwrap();

            var serviceInstanceType = serviceInstance.GetType();

            var aCABusinessHeaderInfo = serviceInstanceType.GetProperty("ACABusinessHeader");
            var securityInfo = serviceInstanceType.GetProperty("Security");
            var aCATransmitterManifestReqDtlInfo = serviceInstanceType.GetProperty("ACATransmitterManifestReqDtl");
            var aCABulkRequestTransmitterInfo = serviceInstanceType.GetProperty("ACABulkRequestTransmitter");

            aCABusinessHeaderInfo.SetValue(serviceInstance, objBusinessHeader, null);
            securityInfo.SetValue(serviceInstance, objSecurityHeader, null);
            aCATransmitterManifestReqDtlInfo.SetValue(serviceInstance, objManifestHeader, null);
            aCABulkRequestTransmitterInfo.SetValue(serviceInstance, objFormData, null);

            return serviceInstance;
        }
    }

    interface IService
    {
        string GetValues();
    }

    class Service2011 : IService
    {
        public int ACABusinessHeader { get; set; }
        public int Security { get; set; }
        public int ACATransmitterManifestReqDtl { get; set; }
        public int ACABulkRequestTransmitter { get; set; }

        public string GetValues()
        {
            return $@"Service 2011 - {ACABusinessHeader} {Security} {ACATransmitterManifestReqDtl}
                {ACABulkRequestTransmitter}";
        }
    }

    class Service2010 : IService
    {
        public int ACABusinessHeader { get; set; }
        public int Security { get; set; }
        public int ACATransmitterManifestReqDtl { get; set; }
        public int ACABulkRequestTransmitter { get; set; }

        public string GetValues()
        {
            return $@"Service 2010 - {ACABusinessHeader} {Security} {ACATransmitterManifestReqDtl}
                {ACABulkRequestTransmitter}";
        }
    }
}

PS - 可能存在更好的解决方案,现在我想不出更好的解决方案

于 2016-09-08T22:59:06.807 回答
0

在与 Web 服务所有者进行了一些通信之后,事实证明我不必处理不同的端点或.wsdl文件的年度版本。无论年份如何,传输都发生在同一端点上,并且为了验证年份之间的架构,Web 服务的所有者检查TaxYear传输清单中的元素以确定要验证的架构。

为了适应这一点,我有 2 个单独的 XML“模板”文档,一个用于每个所需的纳税年度:2015 年和 2016 年。然后,我的应用程序将根据我们尝试传输的数据(通过使用的值)确定要使用的TaxYear模板在清单中)。

我根据表单数据 XML 中可能存在的所有元素手动创建了这些模板。任何重复的元素组只有一个单一的实例。在应用程序中创建了这些的多个实例。

我的应用程序读取 XML 模板并将其中找到的虚拟值替换为从我们的数据中检索到的值。我从架构版本规定的 XML 中删除任何未使用或无效的元素;并创建/克隆我们必须重复的任何元素(例如 1095-C 和 1094-C 表格的第 3 部分)。到目前为止,通过初步测试,这种方法似乎运作良好。

于 2016-11-18T18:07:34.910 回答