Службы RIA, расширяющие сгенерированные кодом частичные классы модели объектов - PullRequest
1 голос
/ 21 июня 2011

Я пишу приложение, которое имеет доступ к данным POCO Entity Framework на сервере. Когда службы RIA создают модель в Silverlight, она генерирует (назовем ее) модель «Службы RIA». То есть это не просто копия моих POCO. Эти классы в модели, для начала, запечатаны и, например, представляют списки как EntityCollections.

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

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

Это вообще не рекомендуется. Это какой-то запах кода? Есть ли веская причина, почему я не должен делать это?

1 Ответ

3 голосов
/ 21 июня 2011

Мы часто используем partial реализации, но я не считаю это запахом кода.На самом деле, я думаю, что это намного лучше, чем оборачивать их большим количеством кода.В этот момент вы могли бы также пропустить RIA и написать свой собственный трекер изменений WCF ... но я отвлекся.

Если вам нужна модель с богатым доменом, то реализации partial являются отличным способом сделать это.,Генератор кода по умолчанию создает частичные методы для наиболее значимых точек в жизненном цикле объекта RIA WCF.Внедрив эти частичные функции, вы отойдете от Анемичной доменной модели .

. Как вы заявили выше, вы можете реализовать интерфейс и создать свои собственные методы и свойства.IOW вы не ограничены в реализации заглушек partial.Если ничего не помогает, измените генератор кода по умолчанию по своему вкусу.Я сделал для удаления sealed из каждой сущности, чтобы облегчить тестирование.

ОБНОВЛЕНИЕ: Вот мой код для удаления sealed

[DomainServiceClientCodeGenerator(typeof (CustomClientCodeGenerator), "C#")]
public class CustomClientCodeGenerator : CSharpClientCodeGenerator
{
    private EntityGenerator _entityGenerator;

    protected override EntityGenerator EntityGenerator
    {
        get { return _entityGenerator ?? (_entityGenerator = new CustomEntityGenerator()); }
    }

    private class CustomEntityGenerator : CSharpEntityGenerator
    {
        public override string TransformText()
        {
            return base.TransformText().Replace("sealed ", string.Empty);
        }
    }
}
...