是否有可能有一个业务逻辑层的实现(基于 CSLA)并从不同的表示技术(如 winform、silverlight 等)使用它。silverlight 存在 CSLA。这是否意味着为不同的演示技术实施和维护不同的 BLL。
任何帮助,将不胜感激。
是否有可能有一个业务逻辑层的实现(基于 CSLA)并从不同的表示技术(如 winform、silverlight 等)使用它。silverlight 存在 CSLA。这是否意味着为不同的演示技术实施和维护不同的 BLL。
任何帮助,将不胜感激。
使用CodeSmith CSLA 模板很容易做到这一点。我们在这里有一个 PetShop Silverlight MVVM 和 Web 示例应用程序,展示了生成的代码。
谢谢 -Blake Niemyjski(CodeSmith CSLA 模板的作者)
这对于 CSLA 来说是非常可能的。将 BLL 与不同的 UI 技术一起使用的主要区别在于,在 Silverlight 的 CSLA 中使用数据门户调用的 Begin & Callback 机制。如果您对所有 UI 技术都使用此机制,这将允许您使用相同的 BLL。
我建议您为 BLL 使用单独的工厂对象,以便您可以决定何时使用 BeginInvoke 和回调机制,并且您的业务对象不会受到影响。
如果您认为有必要,您还可以创建重复的工厂方法。例如,如果您有一个客户业务对象:
public class Customer : Csla.BusinessBase<Customer>
{
private Customer() { }
private void DataPortal_Fetch(SingleCriteria<Customer, int> criteria)
{ // populate here }
}
然后,您可以拥有一个 CustomerFactory 对象,其中包含 Silverlight 和其他 UI 技术的两种方法:
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 方法。
Rocky 实际上有一个示例 (ProjectTracker),它在他的网站上实现了具有多个 UI 层的单个 BLL(在http://www.lhotka.net/cslanet/Download.aspx的“示例”下列出)