[ServiceContract]
public interface ICustomerService
{
[OperationContract]
List<Customer> GetCustomers();
[OperationContract]
bool SaveCustomers(Dictionary<Customer, string> Customers);
}
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class CustomerService : ICustomerService
{
#region ICustomerService Members
public List<Customer> GetCustomers()
{
using (var DB = new NorthwindDataContext())
{
var query = from c in DB.Customers
select c;
return query.ToList();
}
}
public bool SaveCustomers(Dictionary<Customer, string> Customers)
{
TODO: Implement Save
return true;
}
#endregion
}
Damit dieses Service verfügbar ist muss noch die passende web.config (Service Configuration Editor) erstellt werden (passende .svc Datei nicht vergessen bei WCF Service unter WAS/IIS)
Dieses Service wird in Silverlight von der Klasse CustomerDataSource asynchron konsumiert. Dies hat natürlich den Vorteil, dass das UI sofort verfügbar ist wärend die Daten noch nachgeladen werden. Und das man von der ersten Sekunde an deklaratives DataBinding benutzen kann.
Damit die Daten aber tatsächlich nachgeladen werden können brauchen wir zuerst einen Proxy den wir über “Add Service Reference” erzeugen lassen. (Meta-Daten müssen vom Service aktiviert/bereitgestellt werden).
Sobald der CustomerServiceCleint (generierter Code) nun verfügbar ist können wir eine passende Klasse erzeugen und das Service benutzen.
public class CustomerDataSource
{
public CustomerDataSource()
{
LoadCustomers();
}
private void LoadCustomers()
{
CustomerServiceClient client = new CustomerServiceClient();
client.GetCustomersCompleted += (sender, e) =>
{
foreach (var c in e.Result)
{
_Customers.Add(c);
}
};
client.GetCustomersAsync();
}
ObservableCollection<Customer> _Customers = new ObservableCollection<Customer>();
public ObservableCollection<Customer> Customers
{
get {
return _Customers;
}
}
}
<UserControl xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" x:Class="SilverlightConsumeWCF.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:SilverlightConsumeWCF">
<UserControl.Resources>
<local:CustomerDataSource x:Key="Customers" />
</UserControl.Resources>
<Grid x:Name="LayoutRoot" Background="White">
<data:DataGrid ItemsSource="{Binding Path=Customers, Source={StaticResource Customers}}">
</data:DataGrid>
</Grid>
</UserControl>