Silverlight アプリケーションがあり、データベースからデータ (顧客、注文など) を取得できるようにしたいと考えていました。
これで、サーバー アプリケーションで WCF RIA サービスを作成できました。このサービスをクライアント アプリケーションで呼び出して、必要なデータを取得できます。問題は、私が理解している限り、ドメイン サービス呼び出しは非同期であるため、このようなコールバックを作成する必要があることです (したがって、コードのこの部分は正常に動作します)。
private void CountriesCallback(LoadOperation<Country> e)
{
List<Country> countries = e.Entities.ToList();
// add the list as a data source
}
private void ShowAllCountriesButton_Click(object sender, RoutedEventArgs e)
{
MyDomainContext context = new MyDomainContext();
Action<LoadOperation<Country>> callbackCountries = new Action<LoadOperation<Country>>(CountriesCallback);
context.Load(context.GetCountriesQuery(), callbackCountries, null);
}
このように、Silverlight コード ビハインド クラスには、コールバックと非同期メソッドを含む厄介なコードがあります。そのため、次のような、必要なデータだけを返すことができるいくつかの静的メソッドを使用して、いくつかのラッパー クラスを作成したいと考えました。
public class CountriesBL
{
public static int Add(string countryName, string countryCode)
{
MyDomainContext context = new MyDomainContext();
Country c = new Country() { Name = countryName, Code = countryCode };
context.Countries.Add(c);
SubmitOperation submitOp = context.SubmitChanges();
// always returns 0 !!!
return c.CountryId;
}
private static void RemoveCountryCallback(LoadOperation<Country> e)
{
Country c = e.Entities.FirstOrDefault();
if (c != null)
{
Remove(c);
}
}
public static void Remove(int countryID)
{
MyDomainContext context = new MyDomainContext();
EntityQuery<Country> query =
from c in context.GetCountriesQuery()
where c.CountryId == countryID
select c;
Action<LoadOperation<Country>> callbackCountries = new Action<LoadOperation<Country>>(RemoveCountryCallback);
context.Load(query, callbackCountries, null);
}
public static void Remove(Country country)
{
MyDomainContext context = new MyDomainContext();
context.Countries.Remove(country);
context.SubmitChanges();
}
public List<Country> GetAll()
{
//how can I return the collection knowing that the call is Async??
}
}
しかし、ご覧のとおり、挿入された国の ID を返すことも、このアプローチでは国のリストを返すこともできません。ラッパー クラスの作成方法について、他にアイデアや提案はありますか? ユーザー インターフェイスで多くのアプリケーション ロジックやデータ アクセス要素を使用しなければならないのは、非常に奇妙です。
ありがとう