This is very possible with CSLA. The main difference with using your BLL with different UI technologies is the use of the Begin & Callback mechanism of data portal calls in CSLA for Silverlight. If you use this mechanism for all your UI technologies, this would allow you to use the same BLL.
I would suggest that you use separate Factory objects for your BLL so you can decide when to use the BeginInvoke & Callback mechanism and your business objects would be untouched.
You could also create duplicate factory methods if you felt that was necessary. For example if you had a business object of Customer:
public class Customer : Csla.BusinessBase<Customer>
{
private Customer() { }
private void DataPortal_Fetch(SingleCriteria<Customer, int> criteria)
{ // populate here }
}
Then you could have a CustomerFactory object that contained both methods for Silverlight and the other UI technologies:
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
}
}
You could also get a little more clever and implement dependency injection via an IoC container to make the call to your factory methods a little more smart.
The bottom line is that your actual business objects will not change but your factory objects may have duplicate CRUD methods in certain circumstances.
Rocky actually has a sample (ProjectTracker) that implements a single BLL with multiple UI layers at his web site (listed under 'Samples' at http://www.lhotka.net/cslanet/Download.aspx)