breeze: зачем наследовать от Breeze.Sharp.BaseEntity?

Мы начали рассматривать возможность использования BreezeSharp, поскольку у нас есть служба WebAPI ODATA, которую мы хотели бы повторно использовать с сайтом ASP.NET (без участия javascript, только чистый C#).

К сожалению, мы только что заметили, что согласно документации все сущности нашей модели теперь должны наследоваться от Breeze.Sharp.BaseEntity. Нам это не подходит, так как это будет означать зависимость от Breeze в нашей бизнес-модели. Мы бы предпочли сохранить эту зависимость только от службы WebAPI.

Можем ли мы как-то этого избежать? Наличие прокси-классов на стороне клиента, например, когда они не наследуются от BaseEntity?

Любые мысли по этому поводу?


person Sam    schedule 19.06.2014    source источник


Ответы (2)


Требование Breeze.Sharp.BaseEntity относится исключительно к стороне клиента, и причина этого в том, чтобы обеспечить сохранение всех функций, навигацию, исправление ключей, отслеживание изменений и уведомление, а также другие службы, которые делают Бриз клиент так прост в использовании.

Существует интерфейс IEntity, который реализует Breeze.Sharp.BaseEntity, и вы можете реализовать его вместо использования Breeze.Sharp.BaseEntity, однако это очень нетривиальная задача. Мы рассматриваем возможность предложить некоторые рекомендации по этому поводу позже, если наше сообщество в целом сочтет это желательным.

Мы также планируем выпустить реализацию AOP IEntity, которую можно внедрить непосредственно поверх объектов модели POCO, но для этого, вероятно, потребуется PostSharp, а также могут возникнуть проблемы с запуском на некоторых клиентских платформах (Xamarin для Android/IOS). Никаких временных рамок для этого, пока мы не получим представление о спросе.

С другой стороны, текущая реализация очень уважительно относится к объектам вашей модели, в вашу модель добавлено только одно свойство EntityAspect вместе с несколькими событиями.

В прошлом мы пробовали чистый подход POCO на многих других платформах и библиотеках приложений и обнаружили, что недостатки перевешивают минимальную стоимость базового класса, особенно если учесть, что мы хотели, чтобы эта библиотека работала в любом клиенте .NET, включая Xamarin. /Мононуклеоз.

person Jay Traband    schedule 19.06.2014
comment
Я не возражаю против того, чтобы все клиентские объекты наследовались от BaseEntity в частичном классе, но это означает, что мне нужно переписать все свойства. Разве нет способа просто портировать метод RaisePropertyChanged? - person Shimmy Weitzhandler; 27.06.2017

Если я правильно понимаю, вас беспокоит только то, что вы не хотите ссылаться на библиотеки breeze # в своей модели сервера. По-видимому, у вас нет проблем с тесной связью ваших клиентских и серверных классов сущностей в том смысле, что они имеют идентичные свойства и, возможно, также общие методы. Я не осуждаю; Я просто пытаюсь подтвердить ваши архитектурные решения.

Рассматривали ли вы частичные классы?

Вы определяете разделяемый класс в своем проекте бизнес-модели на стороне сервера и ссылка на этот источник класса в вашем проекте модели клиента... где вы сохраняете сопутствующий разделяемый класс с функциями, специфичными для клиента. Этот клиентский файл частичного класса определяет базовый класс breeze#.

Пока вы это делаете, вы можете отделить логику только для сервера в файлах частичных классов, которые находятся в вашем серверном проекте, но не в вашем клиентском проекте.

Такое связывание исходных файлов стало еще проще с VS теперь, когда Microsoft продвигает его в своем видении "Универсальные приложения".

person Ward    schedule 19.06.2014