В прошлом году на PDC’10 Microsoft представила свое новое решение для совместного использования сборок между различными платформами (Windows Phone, Silverlight и .NET), получившее название Portable Library Projects . Дата релиза — H1 2011, так что, надеюсь, они все еще на пути, возможно даже будут включены в VS 2010 SP1. До тех пор мы сами по себе …
Дерик Бэйли на самом деле вызвал этот пост из своего твита немного назад, поэтому я решил поделиться решением, которое я использовал для Bus Watch Chicago .
Шаг 1: определите ваши сущности / модель в проекте клиента (WP7)
Домен для Bus Watch является общественным транспортом, поэтому, естественно, некоторые из моих объектов — Маршруты, Остановки, Транспортные средства, Местоположения и т. Д. Я определяю все эти классы в проекте WP7; Класс Route можно увидеть ниже.
Зоркий глаз, возможно, заметил, что я определил Route как частичный класс, я остановлюсь на этом в шаге 5.
Шаг 2: добавьте «ссылку» на класс модели в вашем веб-проекте
В вашем веб-проекте (в моем случае ASP.NET MVC) щелкните правой кнопкой мыши папку ваших моделей и выберите Добавить -> Существующий элемент …
Затем перейдите в папку «Клиент» и выберите сущности, которые вы планируете сериализовать и представить своему клиенту, но не просто нажмите кнопку Добавить! Рядом с кнопкой «Добавить» находится стрелка раскрывающегося списка, откройте ее и убедитесь, что вы нажимаете « Добавить как ссылку».
Обратите внимание, что файлы имеют небольшие «ярлыки» на своих значках.
Шаг 3: сериализация вашей модели как JSON с контроллера MVC
Обратите внимание на то, как я использую проекции LINQ для преобразования моего «DbRoute» в маршрут, который можно красиво сериализовать в JSON в формате, ожидаемом моим клиентом.
[OutputCache(Duration = 10000, VaryByParam = "*")] public ActionResult GetRoutes() { var db = new CtaEntitiesDataContext(); var routes = db.DbRoutes .OrderBy(r => r.Number) .Select(r => new Route { RouteId = r.RouteId, Name = r.Name, Directions = r.Directions, Number = r.Number }); return Json(routes, JsonRequestBehavior.AllowGet); }
Шаг 4: десериализовать JSON на клиенте
Я использую SerializationHelper для переноса стандартного DataContractJsonSerializer, встроенного в .NET, поэтому, пожалуйста, не стесняйтесь его использовать.
public static class SerializationHelper { public static T Deserialize<T>(string serialized) { if (string.IsNullOrEmpty(serialized)) return default(T); using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(serialized))) { var ser = new DataContractJsonSerializer(typeof(T)); return (T)ser.ReadObject(ms); } } public static string Serialize<T>(T obj) { var serializer = new DataContractJsonSerializer(obj.GetType()); using(var ms = new MemoryStream()) { serializer.WriteObject(ms, obj); ms.Position = 0; var sr = new StreamReader(ms); var json = sr.ReadToEnd(); sr.Close(); return json; } } }
Затем на моем клиенте я просто преобразовываю сериализованную строку JSON из моего контроллера MVC в IEnumerable <Route>. Используя «ссылку» Route.cs, я гарантирую, что если я добавлю свойство в мой класс Route, оно будет правильно сериализовано и десериализовано на обоих концах передачи.
public IEnumerable<Route> ConvertRoutes(string serialized) { return SerializationHelper.Deserialize<IEnumerable<Route>>(serialized); }
Шаг 5: свойства / поведение только клиента (необязательно)
Во многих реальных приложениях вам потребуются дополнительные свойства и методы вашей клиентской модели, которые на самом деле не принадлежат на стороне сервера. Для решения этой проблемы мы будем использовать частичные классы.
Обратите внимание, что в обозревателе решений у меня есть RouteClient.cs, который определяет клиентские свойства и методы этой сущности. Например, пользователи Bus Watch могут хранить свои FavoriteStops для заданного маршрута, естественно, все эти данные будут сохранены на стороне клиента приложения и не могут / не должны передаваться с сервера. Используя отдельный файл .cs, который не «связан» на стороне сервера приложения, я гарантирую, что проект WP7 будет взаимодействовать с полным богатством сущности Route, тогда как стороне сервера просто придется беспокоиться о сериализации. и доказывая соответствующие свойства клиенту.
Надеюсь , это поможет кому — то начать работу с wp7dev с помощью ASP.NET MVC