Это очень возможно с 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)