【发布时间】:2011-05-15 09:43:48
【问题描述】:
我有一个应用程序,它存在于 3 个不同的表示层...网络、移动(离线)和桌面(离线)。这三者的核心业务对象是相同的,它们共享相同的验证和业务规则。但是,它们都使用不同的数据库(Web - SQL Server 2008,移动/桌面 - SQL Compact)。通过同步过程,桌面和移动应用程序从服务器的 SQL 2008 db 推送和接收数据。
我正在尝试提出最好的 n 层方法,但我有点卡住了。我为我的业务对象创建了一个程序集,它封装了所有业务规则。我非常希望这个程序集中的每个对象都有一个 Save() 方法。但是,我不希望这一层知道任何特定的数据层。基本上,我希望所有三个表示层都填充这些对象并调用 Save() 方法。但我希望 Save() 方法的实现因调用应用程序而异。
我最初创建了一个名为 IDataAdapter 的接口,然后在每个对象上为 IDataAdapter 创建了一个静态属性。然后 Save() 方法检查是否已设置,然后将业务对象传递给它的 Save() 方法。
public interface IDataAdapter
{
void Save(BusinessProxy proxy);
}
public class BusinessProxy
{
public IDataAdapter myAdapter { get; set; }
public bool Save()
{
if (myAdapter == null)
throw new Exception();
myAdapter.Save(this);
}
}
当然,这并不理想,因为表示层需要引用数据层才能设置 Adapter 属性。我真的很想拥有某种插件系统,我可以根据应用平台换掉 data.dll。
有人对如何更好地实现这一点有任何建议吗?
【问题讨论】: