gpt4 book ai didi

c# - 您如何获得 WCF 代理来构造子集合?

转载 作者:行者123 更新时间:2023-11-30 21:14:43 25 4
gpt4 key购买 nike

我今天在学习,我做了我的第一个非常简单的 WCF 服务。我创建了几个非常简单的类如下(这有点简化)...

//contact class  
public class Contact
{
public int Id { get; set; }


private ObservableCollection<Phone> _contactPhones = new ObservableCollection<Phone>();
public ObservableCollection<Phone> ContactPhones
{
get { return _contactPhones; }
set { _contactPhones = value; }
}

public string FirstName { get; set; }

public string LastName { get; set; }
}
// phone class
public class Phone
{
public string PhoneNumber { get; set; }
public PhoneTypes PhoneType { get; set; }
}

我有一个模拟存储库类,它返回联系人类的集合

class ContactRepositoryMock : IContactRepository
{
private readonly ObservableCollection<Contact> _contactList;

public ContactRepositoryMock()
{
_contactList = new ObservableCollection<Contact>();

Contact contact = this.Create();
contact.Id = 1;
contact.FirstName = "Seth";
contact.LastName = "Spearman";
contact.ContactPhones.Add(new Phone(){PhoneNumber = "864-555-1111",PhoneType = PhoneTypes.Mobile});
contact.ContactPhones.Add(new Phone(){PhoneNumber = "864-555-2222",PhoneType = PhoneTypes.Home});

this.Save(contact);

}
public ObservableCollection<Contact> GetContacts()
{
return _contactList;
}

}

Save 和 Create 方法未显示,但 Save 添加到 _contactList 集合,Create 创建一个新的联系人实例(注意 Contact 构造函数正在使用预先加载来初始化电话 _contactPhones 集合)

最后,我围绕 ContactRepositoryMock.GetContacts 方法创建了一个 WCF 服务包装器,如下所示...

[ServiceContract(Namespace = "")]
[SilverlightFaultBehavior]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class ContactsService
{
private ContactRepositoryMock _contactRepository = new ContactRepositoryMock();

[OperationContract]
public ObservableCollection<Contact> GetContacts()
{
return _contactRepository.GetContacts();
}
}

另一个项目是 Silverlight 项目(这正是我今天要学习的项目。)

在该项目中,我向我的 WCF 类添加了一个 Web 引用,而 Visual Studio 照常添加了代理类。

我在项目中添加了一个MainPageViewModel如下:

public class MainPageViewModel : ViewModelBase
{
public MainPageViewModel()
{
if (!IsDesignTime)
{
//GetContacts(); //not shown
}
else
{
var contactList = new ObservableCollection<Contact>();

var contact = new Contact {Id = 1, FirstName = "Seth", LastName = "Spearman"};
contact.ContactPhones.Add(new Phone() { PhoneNumber = "864-555-1111", PhoneType = PhoneTypes.Mobile });
contact.ContactPhones.Add(new Phone() { PhoneNumber = "864-555-2222", PhoneType = PhoneTypes.Home });
contactList.Add(contact);

Contacts= contactList;
}
}

private ObservableCollection<Contact> _contacts;
public ObservableCollection<Contact> Contacts
{
get { return _contacts; }
set
{
if (value!=_contacts)
{
_contacts = value;
OnPropertyChanged("Contacts");
}
}
}
}

以及以下 XAML

<UserControl x:Class="MVVMDemo.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
xmlns:viewModels="clr-namespace:MVVMDemo.ViewModels"
d:DesignHeight="300" d:DesignWidth="400">
<UserControl.Resources>
<viewModels:MainPageViewModel x:Key="ViewModels" />
</UserControl.Resources>

<Grid x:Name="LayoutRoot"
DataContext="{Binding Source={StaticResource ViewModels}}"
Background="White">
</Grid>
</UserControl>

错误的背景知识很多,最终可能是一个简单的解释。

XAML 行 <viewModels:MainPageViewModel x:Key="ViewModels" />它下面有一条波浪线,并返回错误“无法创建 MainPageViewModel 的实例”。

我什至知道那个错误的原因。如果我禁用 MainPageViewModel ctor 中的 contact.ContactPhones.Add ... 行,则错误消失。

最后,我什至知道为什么错误消失了。这是因为创建 WCF 代理类的引用文件没有初始化 ContactPhones 集合。

换句话说,在代理中生成的类 Reference.cs 中,如果我更改读取的行...

private System.Collections.ObjectModel.ObservableCollection<MVVMDemo.WSProxy.Phone> ContactPhonesField;

private System.Collections.ObjectModel.ObservableCollection<MVVMDemo.WSProxy.Phone> ContactPhonesField = new ObservableCollection<Phone>();

然后我可以重新启用 contact.ContactPhones.Add... 行,错误就会消失。项目编译运行。

那么...所有这些只是简单地问...我如何让 Visual Studio 生成将初始化我的集合的代理类。或者我这样做的方式有缺陷吗?我错过了什么?

对于所有细节,我深表歉意,但我不确定调用链中的哪个位置可能会出现故障。在这个问题得到回答后,我还将使用所有这些细节再问几个问题。

赛斯

最佳答案

WCF 不调用任何构造函数(根本)。两种选择:

  • 添加一个反序列化回调 ( MSDN )
  • 在属性(property)中处理

IMO 第二个更容易:

ObservableCollection<Phone> _contactPhones;
[DataMember]
public ObservableCollection<Phone> ContactPhones
{
get { return _contactPhones ?? (
contactPhones = new ObservableCollection<Phone>());
}

关于c# - 您如何获得 WCF 代理来构造子集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6077661/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com