Лучшая практика для навигационных свойств EF в WCF - PullRequest
0 голосов
/ 12 июля 2011

Каков будет предложенный шаблон и / или технология для выполнения следующих действий на основе текущего состояния .NET?

Я хочу распространять сгенерированную EF модель базы данных SQL через службы WCF. Я не хочу отключать Lazy Loading в EF, потому что я не хочу каскадной загрузки иерархически структурированных объектов.

На стороне клиента я не хочу иметь доступ к свойствам навигации, как если бы я имел дело с реальными объектами EF, а не с прокси WCF. Я не хочу отправлять EF-объекты, включая context-objects, потому что это, по моему мнению, разрушило бы SOA-шаблон.

На самом деле я хочу изменить реализацию Reference.cs-файлов, сгенерированных Visual Studio, чтобы каждый доступ к свойству навигационной системы вызывал асинхронный обратный вызов для сервисного уровня, если это необходимо.

Образец: это класс компании, который ссылается на обязательное через свойство навигации. Вот что по умолчанию дает мне WCF-прокси-техника:

* * 1010

Я хочу, чтобы это было:

    [System.Runtime.Serialization.DataMemberAttribute()]
    public AddressManager.CompanyService.Mandatory Mandatory {
        get {
            if (this.MandatoryField == null)
            {
                // RAISE SERVICE-METHOD HERE
            }
            return this.MandatoryField;
        }
        set {
            if ((object.ReferenceEquals(this.MandatoryField, value) != true)) {
                this.MandatoryField = value;
                this.RaisePropertyChanged("Mandatory");
            }
        }
    }

Ответы [ 2 ]

2 голосов
/ 12 июля 2011

Это не очень хороший способ.

  • Вы говорите о SOA и в то же время собираетесь нарушить один из прежних принципов SOA - границы явные.Это означает, что вы не должны скрывать какие-либо удаленные вызовы в свойство getter.Явное означает, что разработчик должен видеть, что если ему нужны дополнительные данные, он должен вызвать метод на прокси-сервере, и он создаст удаленный вызов, который в 1000 раз медленнее, чем локальный вызов.Нет скрытых удаленных звонков в свойствах геттеров.На самом деле вы разработали ленивую загрузку через WCF, и этого вам следует избегать.
  • Одна из основных целей в большинстве распределенных систем - сокращение количества циклов, поэтому создание циклов для каждого свойства навигации может быть плохим подходом.Если вы создаете клиентский код, для которого нужно загрузить несколько связанных объектов, лучшим способом является специальная операция обслуживания, которая вернет все из них в одну поездку.Несколько циклических циклов имеют смысл только в том случае, если загрузка связанных сущностей происходит позже во время другой клиентской операции, которая не связана с операцией, в которой была загружена исходная сущность.
  • Не трогайте Reference.cs - сгенерированный код и сгенерированный код не должныникогда не изменяйте вручную, потому что после внесения каких-либо изменений в службу и обновления прокси ваша модификация будет потеряна.
0 голосов
/ 12 июля 2011

Джефф сказал мне использовать OData, и это сработало для меня.Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...