我有一个 CibilResponse 类,它具有类类型(TUEF 类)的属性。
我正在尝试使用以下方式分配值:CibilEnquiryEnq.Tuef.Version = "12";
但它会抛出空引用错误。我已经解决了这个错误,但是通过创建一个像这样的对象:CibilEnquiryEnq.Tuef = new CibilWcfService.TUEF();
而不是通过构造函数。
ICIBIL.cs
[ServiceContract]
public interface ICIBIL
{
[OperationContract]
string InsertCibil(CibilResponse cibilResponse);
[OperationContract]
string TestInsert(string testObj);
[OperationContract]
string GenerateEnquiry(CibilEnquiry testObj);
}
[DataContract]
public class CibilEnquiry
{
[DataMember]
public TUEF Tuef { get; set; }
public CibilEnquiry()
{
this.Tuef = new TUEF();
}
}
[DataContract]
public class TUEF
{
[DataMember]
public string SegmentTag { get; set; }
[DataMember]
public string Version { get; set; }
[DataMember]
public string MemberReferenceNumber { get; set; }
}
应用程序:(不工作)
CibilWcfService.CIBIL obj = new CibilWcfService.CIBIL();
CibilWcfService.CibilEnquiry CibilEnquiryEnq = new CibilWcfService.CibilEnquiry();
CibilEnquiryEnq.Tuef.Version = "1111"; // null reference error here and Tuef is null
应用:(工作)
CibilWcfService.CIBIL obj = new CibilWcfService.CIBIL();
CibilWcfService.CibilEnquiry CibilEnquiryEnq = new CibilWcfService.CibilEnquiry();
CibilEnquiryEnq.Tuef = new CibilWcfService.TUEF();
CibilEnquiryEnq.Tuef.Version = "1111";//works fine
我不明白为什么我必须添加 CibilEnquiryEnq.Tuef = new CibilWcfService.TUEF();
才能完成这项工作。我已经在我的 wcf 的构造函数中初始化 tuef。
我在控制台应用程序(不包括 wcf)中创建了一个示例,它在没有 Tuef = new TUEF();
的情况下工作正常,在构造函数中初始化就足够了。
最佳答案
通过添加服务引用生成的代理对象与您在服务契约中定义的对象不同,它们恰好是在消费客户端服务引用下的相同 namespace 等中创建的。基本上,它们只是您用来使用服务的 DTO。
如果你想在对象之间有很强的依赖性,那么你不能使用服务引用,你需要将契约提取到一个你可以引用的单独程序集中。
1) CibilWcfService.Contract - 包含 ICIBIL 接口(interface) + 数据契约(Contract)对象。 DataContract 相关属性需要引用 System.ServiceModel、System.ServiceModel.Web 和 System.Runtime.Serialization。
2) CibilWcfService - 它托管 WCF 服务并引用 CibilWcfService.Contract 程序集。
namespace CibilWcfService
{
using CibilWcfService.Contract;
public class CibilService : ICIBIL
{
// ... Interface implementation
}
}
3) CibilClient - 这是您的消费客户端应用程序,它还引用 CibilWcfService.Contract 程序集。您像这样创建服务 channel ,然后新的 CibilEnquiry() 使用与契约(Contract)中定义的相同的构造函数。您需要为 ChannelFactory 引用 System.ServiceModel。
using CibilWcfService.Contract;
var cf = new ChannelFactory<ICIBIL>();
var channel = cf.CreateChannel(new EndpointAddress("http://127.0.01/CibilServiceUri"));
if (channel != null)
{
var CibilEnquiryEnq = new CibilEnquiry();
CibilEnquiryEnq.Tuef.Version = "1111";
channel.GenerateEnquiry(CibilEnquiryEnq);
}
关于c# - 无法通过 WCF 中的构造函数初始化成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33752947/