Как реализовать один уровень бизнес-логики на основе CSLA и использовать его из WPF, Winform и Silverlight? - PullRequest
0 голосов
/ 05 марта 2010

Возможно ли иметь единственную реализацию уровня бизнес-логики (на основе CSLA) и использовать его из различных технологий представления, таких как winform, silverlight и т. Д. Для silverlight существует CSLA. Означает ли это, что внедрять и поддерживать разные BLL для разных технологий презентации.

Любая помощь будет оценена.

Ответы [ 2 ]

2 голосов
/ 18 августа 2010

Это очень легко сделать с помощью шаблонов CodeSmith CSLA . У нас есть пример PetShop Silverlight MVVM и веб-приложения, расположенный здесь , который демонстрирует сгенерированный код.

Спасибо Блейк Немийски (Автор шаблонов CodeSmith CSLA )

0 голосов
/ 05 марта 2010

Это очень возможно с CSLA.Основное отличие от использования вашего BLL с различными технологиями пользовательского интерфейса заключается в использовании механизма запуска и обратного вызова вызовов портала данных в CSLA для Silverlight.Если вы используете этот механизм для всех ваших технологий пользовательского интерфейса, это позволит вам использовать один и тот же BLL.

Я бы предложил использовать отдельные объекты Factory для вашего BLL, чтобы вы могли решить, когда использовать BeginInvoke & Callback.механизм и ваши бизнес-объекты не будут затронуты.

Вы также можете создать дубликаты фабричных методов, если считаете, что это необходимо.Например, если у вас есть бизнес-объект Customer:

public class Customer : Csla.BusinessBase<Customer>
{
    private Customer() { }

    private void DataPortal_Fetch(SingleCriteria<Customer, int> criteria)
    { // populate here }

}

Тогда у вас может быть объект CustomerFactory, содержащий оба метода для Silverlight и другие технологии пользовательского интерфейса:

public static class CustomerFactory
{
    // Handle most UI needs
    public static Customer Fetch(int id)
    {
        return DataPortal.Fetch<Customer>(new SingleCriteria<Customer, int>(id));
    }

    // Handle Silverlight needs
    public static void Fetch(int id)
    {
        DataPortal.BeginFetch<Customer>(id, FetchCallback); 
    }

    private static FetchCallback(object sender, DataPortalResult<Customer> result)
    {
        // notify the UI of result.Object
    }
}

Вы можететакже сделайте его немного более умным и внедрите внедрение зависимостей через контейнер IoC, чтобы сделать вызов к фабричным методам более интеллектуальным.

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

У Рокки есть образец (ProjectTracker), который реализует один BLL с несколькими слоями пользовательского интерфейса на своем веб-сайте (указан в разделе «Образцы» на http://www.lhotka.net/cslanet/Download.aspx)

...