У кого-нибудь есть реальный опыт CSLA? - PullRequest
50 голосов
/ 19 августа 2008

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

программисты больше не читают книги

Я хотел оценить мнение сообщества SOFlow об этом.

Итак, вот мои вопросы:

  1. Как люди могут использовать CSLA?
  2. Какие плюсы и минусы?
  3. Действительно ли CSLA не вписывается в TDD?
  4. Какие у меня есть альтернативы?
  5. Если вы перестали его использовать или решили против?

Ответы [ 23 ]

72 голосов
/ 19 августа 2008

Прежде чем я конкретно отвечу на ваш вопрос, я хотел бы изложить несколько соображений. Подходит ли CSLA для вашего проекта? Это зависит. Я бы лично рассматривал CSLA для настольных приложений, которые не считают модульное тестирование высоким приоритетом. CSLA отлично подходит, если вы хотите легко масштабировать приложение до уровня n. CSLA имеет тенденцию испытывать некоторое недовольство, потому что не допускает чистого модульного тестирования. Это правда, однако, как и все в технологии, я считаю, что Единого истинного пути нет. Модульное тестирование может не быть тем, что вы предпринимаете для конкретного проекта То, что работает для одной команды и одного проекта, может не работать для другой команды или другого проекта.

Есть также много заблуждений относительно CSLA. Это не ORM. он не является конкурентом NHibernate (фактически, используя CLSA Business Objects и NHibernate, поскольку доступ к данным очень хорошо сочетается). Это формализует концепцию мобильного объекта .

1. Сколько людей используют CSLA?
Основываясь на CSLA Forums , я бы сказал, что существует довольно много проектов, основанных на CSLA. Честно говоря, я понятия не имею, сколько людей на самом деле используют его. Я использовал его в прошлом на двух проектах.

2. Какие плюсы и минусы?
Хотя в кратком списке трудно подвести итог, вот некоторые из доводов "за" и "против", которые приходят на ум.
Плюсы:

  • Легко получить новых разработчиков разгоняться, набирать скорость. Книга и образец CSLA Приложение - это отличный ресурс, чтобы набрать скорость.
  • Среда валидации действительно мирового класса и "заимствована" для многих других проектов и технологий, не относящихся к CSLA.
  • n-Level Undo в ваших бизнес-объектах
  • Изменение строки конфигурации для n-уровневой масштабируемости (Примечание: даже не необходима перекомпиляция)
  • Ключевые технологии абстрагированы от «реального» кода. Когда был WCF введено, это оказало минимальное влияние на Код CSLA.
  • Возможно делить ваши бизнес-объекты между окнами и веб-проектами.
  • CSLA способствует нормализации поведения , а не нормализации данных (оставляя базу данных для нормализации данных).

Минусы:

  • Сложность в юнит-тестировании
  • Отсутствие разделения интересов (как правило, ваши бизнес-объекты имеют код доступа к данным внутри них).
  • Поскольку CSLA способствует нормализации поведения , а не нормализации данных , и это может привести к тому, что бизнес-объекты будут иметь одинаковые имена, но для разных целей. Это может вызвать некоторую путаницу и ощущение, будто вы не используете объекты должным образом. Тем не менее, после того, как сделан физиологический скачок, это более чем логично - кажется неуместным структурировать объекты «старым» способом.
  • Не так "модно" создавать приложения таким образом. Вы можете изо всех сил пытаться получить разработчиков, которые увлечены технологией.

3. После прочтения этого действительно ли CSLA не вписывается в TDD?
Я не нашел эффективного способа сделать TDD с CSLA. Тем не менее, я уверен, что есть много более умных людей, чем я, которые могли бы попробовать это с большим успехом.

4. Какие у меня есть альтернативы?
Domain-Driven-Design в настоящее время получает большой толчок (и это справедливо - это фантастика для некоторых приложений). Существует также ряд интересных шаблонов, которые развиваются с появлением LINQ (и LINQ to SQL, Entity Framework и т. Д.). В книге Фаулера PoEAA подробно описаны многие шаблоны, которые могут подойти для вашего приложения. Обратите внимание, что некоторые шаблоны конкурируют (например, Active Record и Repository) и, следовательно, предназначены для использования в конкретных сценариях. Хотя CSLA не совсем соответствует ни одному из паттернов, описанных в этой книге, она больше всего напоминает Active Record (хотя я чувствую, что недальновидно требовать точного соответствия для этого паттерна).

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

В целом, хотя CSLA - это не просто серебряная пуля , она подходит для некоторых сценариев.

Надеюсь, это поможет!

22 голосов
/ 02 августа 2009

Прочитав все ответы, я заметил, что довольно много людей имеют некоторые неправильные представления о CSLA.

Во-первых, CSLA не является ORM . Как я могу сказать это так определенно? Потому что Рокфорд Лхотка сам много раз заявлял об этом в интервью на подкастах .NET Rocks и Hanselminutes . Ищите любой эпизод, где Рокки давал интервью, и он изложит это недвусмысленно. Я думаю, что это самый важный факт, который люди могут понять, потому что почти все неправильные представления о CSLA вытекают из веры в то, что это ORM, или в попытке использовать его как единое целое.

Как отметил Брэд Лич в своем ответе, объекты CSLA моделируют поведение, хотя, возможно, было бы точнее сказать, что они моделируют поведение данных, поскольку данные являются для них неотъемлемыми. CSLA - это не ORM, потому что он абсолютно независим от того, как вы общаетесь с вашим хранилищем данных. Вы должны использовать некоторый уровень доступа к данным с CSLA, возможно, даже ORM. (Да. Теперь я использую Entity Framework, который прекрасно работает.)

Теперь перейдем к юнит-тестированию. У меня никогда не было проблем с модульным тестированием моих объектов CSLA, потому что я не помещаю свой код доступа к данным непосредственно в свои бизнес-объекты. Вместо этого я использую некоторые варианты шаблона хранилища. Репозиторий используется CSLA, а не наоборот. Путем замены поддельного репозитория для моих модульных тестов и использования локального портала данных, BOOM! все просто. (Как только Entity Framework разрешит использование POCO, это станет еще чище.)

Все это происходит от осознания того, что CSLA не является ORM. Он может потреблять ORM, но сам по себе он не один.

Приветствие.

UPDATE

Я думал, что сделаю еще несколько комментариев.

Некоторые люди говорят, что CSLA является многословным по сравнению с такими вещами, как LINQ to SQL и так далее. Но здесь мы сравниваем яблоки с апельсинами. LINQ to SQL - это ORM. Он предлагает некоторые вещи, которых нет у CSLA, а CSLA предлагает некоторые вещи, которых нет у L2S, например, встроенную проверку и n -постоянство через различные порталы удаленных данных. На самом деле, я бы сказал, что последнее, n - более настойчивость, превосходит их все для меня. Если я хочу использовать Entity Framework или LINQ to SQL по сети, я должен поместить что-то вроде WCF между ними, и это значительно умножит объем работы и сложность до такой степени, что я думаю, что это будет намного больше многословнее, чем CSLA. (Теперь я фанат WCF, REST и SOA, но использую его там, где он действительно нужен, например, когда вы хотите предоставить сервис третьим лицам. Для большинства бизнес-приложений это не так. действительно необходим, и CSLA - лучший выбор.) Фактически, с последней версией CSLA, Rocky предоставляет WCFDataPortal, который я использовал. Отлично работает.

Я фанат SOLID , TDD и других современных принципов разработки программного обеспечения и использую их везде, где это возможно. Но я думаю, что преимущества CSLA перевешивают некоторые возражения этих ортодоксов, и в любом случае мне удалось заставить CSLA довольно хорошо (и легко) работать с TDD, так что это не проблема.

19 голосов
/ 19 августа 2008

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

Если вы думаете о своем стандартном сложном бизнес-приложении, у вас может быть форма со многими полями, множеством правил для этих полей (включая правила проверки по нескольким полям), вы можете вызвать модальное диалоговое окно для редактирования некоторого дочернего объекта. Вы можете захотеть иметь возможность отменять такие диалоги и возвращаться к предыдущему состоянию. CSLA поддерживает это.

Его минусы в том, что у него есть немного кривой обучения.

Ключевым моментом, который следует помнить, является использование CSLA для моделирования того, как пользователь взаимодействует с формами в каком-либо приложении. Самым эффективным способом для меня было создание пользовательского интерфейса и понимание его потоков, поведения и правил проверки перед созданием объектов CSLA. Не заставляйте свои объекты CSLA управлять дизайном пользовательского интерфейса.

Мы также сочли очень полезным иметь возможность использовать серверную часть бизнес-объектов CSLA для проверки объектов, отправленных клиентами.

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

CSLA обеспечивает строгое разделение между вашим пользовательским интерфейсом, BusinessLogic и Persistance, и мы написали множество модульных тестов против них. Это может быть не строго TDD, потому что вы используете его в дизайне пользовательского интерфейса, это не значит, что он не тестируемый.

Единственная реальная альтернатива - это создание собственной модели \ бизнес-объектов, но довольно скоро вы в конечном итоге реализуете функции, которые CSLA предлагает «из коробки» (INotifyPropertyChanged, IDataErrorInfo, PushState, PopState и т. Д.)

11 голосов
/ 19 августа 2008

У меня был опыт с этим несколько лет назад. Это блестящая архитектура, но очень сложная, трудная для понимания или изменения, и она решает проблему, которая не обязательно возникает у большинства из нас, разрабатывающих веб-приложения. Он был разработан больше для приложений на базе Windows и обработки многоуровневых отмен, с большим акцентом на транзакционную логику. Вы, вероятно, услышите, как люди говорят, что, поскольку веб-приложения являются запросом-ответом на уровне страницы, это неуместно, но с веб-приложениями в стиле AJAX, возможно, этот аргумент не содержит столько воды.

У него очень глубокая объектная модель, и может потребоваться некоторое время, чтобы действительно обернуть вокруг него свой мозг. Конечно, многое может измениться за несколько лет. Мне было бы интересно услышать другие недавние мнения.

Учитывая все обстоятельства, это не будет моим первым выбором архитектуры.

11 голосов
/ 30 октября 2008

Я использовал CSLA для одного проекта, и он отлично работал и сделал вещи намного проще и аккуратнее.

Вместо того, чтобы ваша команда писала бизнес-объекты в своем индивидуальном стиле, мы знаем, что у нас есть общий стандарт для работы.

// * 1005 Энди *

8 голосов
/ 28 августа 2008

В защиту CSLA, хотя я согласен со многими комментариями, в частности, с юнит-тестированием ...

Моя компания широко использовала его для приложений ввода данных Windows Forms, с высокой степенью успеха.

  • Это обеспечивало готовую функциональность, которую у нас не было времени или опыта, чтобы написать самим.
  • Он стандартизировал все наши бизнес-объекты, упрощая обслуживание и сокращая время обучения для наших новых разработчиков.

В целом, я бы сказал, что любые проблемы, которые он вызвал, были более чем перевешены преимуществами.

ОБНОВЛЕНИЕ: В дополнение к этому мы все еще используем его для нашего приложения для форм Windows, но эксперименты с его использованием для других приложений, таких как веб-сайты, показали, что, возможно, это будет громоздким, когда вам не нужно много его функциональности, и в настоящее время изучаются варианты облегченного веса для этих сценариев.

7 голосов
/ 22 февраля 2011

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

Пара вопросов:

Мне не нужен дорожный блок между моим кодом и .NET-фреймворком, что мне и казалось. У меня был ограниченный выбор объектов списка, хотя мне просто нужно было игнорировать объекты расширенного списка в .NET Framework.

Мне совершенно смешно, что у нас были эти списки только для чтения, а затем списки только для чтения. Так что, если бы мне пришлось добавить элемент в список, мне пришлось бы воссоздать весь список ... ты серьезно?

Тогда csla хочет управлять моим состоянием объекта, что нормально, но на самом деле ничего не выставлено. Иногда я хочу изменить состояние объекта вручную, а не извлекать его снова, что похоже на то, что csla хочет от меня. В основном я в конечном итоге создал много свойств, чтобы выставить опции, потому что я не думал, что у меня должен быть прямой доступ.

Почему я не могу просто создать экземпляр объекта? В итоге мы создаем статические методы, которые создают экземпляр объекта и возвращают его обратно ... ты шутишь?

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

Причины использования csla:

  • прямой .net Framework слишком силен для вас.
  • ваши разработчики не опытные и не могут понять концепцию шаблонов, тогда csla в значительной степени будет иметь всех на одной странице.

    1. Мне не нужен дорожный блок между моим кодом и .NET Framework ... Я застрял с этими объектами списка.
6 голосов
/ 19 августа 2008

Наша компания практиковала CSLA в некоторых своих проектах, а некоторые из устаревших проектов остаются CSLA. Другие проекты отошли от него, потому что CSLA нарушила простое и понятное правило ООП: принцип единой ответственности.

Объекты CSLA являются самодостаточными, например, они извлекают свои собственные данные, они управляют своим собственным поведением, они сохраняют себя. К сожалению, это означало, что ваш средний объект CSLA имеет как минимум три обязанности - представлять модель предметной области, содержать бизнес-правила и содержать определение доступа к данным (не DAL или реализацию доступа к данным, как я ранее указывал / подразумевал), все одновременно время.

6 голосов
/ 19 августа 2008

Мы начали использовать CSLA, потому что думали, что это поможет с нашим уровнем модели. Это было своего рода излишним, и в основном все, что мы сейчас используем, это класс SmartDate только потому, что мы уже связаны с библиотекой.

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

6 голосов
/ 06 апреля 2009

Не брать CSLA из списка, но перед его использованием изучите преимущества и убедитесь, что они действительно применимы. Сможет ли ваша команда правильно / последовательно это реализовать? Remoting и портал танец нужны?

Я думаю, что помимо теоретического размышления, речь идет о чистом / поддерживаемом / расширяемом / тестируемом коде, следуя базовым проверенным шаблонам.

Я посчитал строки кода, необходимые в конкретной области проекта, преобразованной из CSLA. Между всеми различными объектами CSLA (комбинации «только для чтения» + «редактируемый + корень + список») и их хранимыми процессами потребовалось около 1700 строк, а реализация Linq2SQL + Repository заняла 180 строк. Версия Linq2SQL состояла в основном из сгенерированных классов, которые вашей команде не нужно использовать для понимания книги. И да, я использовал CodeSmith для генерации частей CSLA, но теперь я верю в DRY-код с единичными битами ответственности, и реализация CSLA теперь выглядит для меня как вчерашний герой.

В качестве альтернативы я хотел бы предложить рассмотреть Linq2Sql / Entity Framework / NHibernate в сочетании с шаблонами Repository и UnitOfWork. Посмотрите на http://www.codeplex.com/backgroundmotion

Ура!

...