Приложение Silverlight - оболочка над доменной службой (WCF RIA) - PullRequest
1 голос
/ 24 марта 2011

У меня есть приложение Silverlight, и я хотел иметь возможность получать данные (клиенты, заказы и т. Д.) Из базы данных.

Сейчас мне удалось создать в серверном приложении службу RIA WCF, котораяЯ могу позвонить в клиентское приложение и получить необходимые данные.Проблема в том, что, насколько я понял, вызовы службы домена являются асинхронными, и поэтому я должен создать обратный вызов, что-то вроде этого (так, эта часть кода работает нормально)

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??
        }
    }

Но, как вы видите, я не могу вернуть вставленную странуЯ не могу вернуть список стран с таким подходом.Есть ли у вас какие-либо идеи или предложения по созданию класса-обертки?Было бы очень странно использовать много логики приложения и даже элементы доступа к данным в пользовательском интерфейсе.

Спасибо

...