【问题标题】:N-Tier Design for Common Business Tier but Different Presentation and Data Tiers通用业务层但不同表示层和数据层的 N 层设计
【发布时间】: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。

有人对如何更好地实现这一点有任何建议吗?

【问题讨论】:

    标签: c# n-tier-architecture


    【解决方案1】:

    如果您的意思是“最好的 n 层方法” 不同的层不应该互相认识 并且只有一种方法可以将各个部分链接在一起 您可以创建一个全局 DataAdapter-registry 基于字典

    BusinessProxy 可以请求使用其 IDataAdapter 的位置。

    公共接口 IDataAdapter { 无效保存(BusinessProxy 代理); } 公共类 BusinessProxy { 公共静态 DataAdapterRegistry 适配器 = new DataAdapterRegistry(); 公共布尔保存() { Adapter.Save(this); 返回真; } } 公共类 DataAdapterRegistry : IDataAdapter { 私有 Dictionary 注册表 = 新字典(); 公共无效寄存器(类型类型,IDataAdapter 适配器) { 注册表[类型] = 适配器; } 公共无效保存(BusinessProxy 代理) { IDataAdapter 适配器; if (registry.TryGetValue(proxy.GetType(), out adapter)) 适配器.保存(代理); 别的 抛出新的 NotSupportedException(proxy.GetType().FullName); } } 客户类:BusinessProxy { } 类订单:BusinessProxy { } 课堂节目 { 静态无效主要(字符串 [] 参数) { BusinessProxy.Adapter.Register(typeof(Customer), new CustomerAdapter()); BusinessProxy.Adapter.Register(typeof(Order), new OrderAdapter()); } }

    您可以使用诸如 spring.net 之类的“控制容器反转”框架来处理 xml-configurtaion 文件而不是硬编码编译时初始化。

    【讨论】:

      【解决方案2】:

      我是 Simple 的忠实粉丝。

      您可以做的一件事就是将您的 Save 方法分离到依赖于平台的程序集。只需将其设为扩展方法,以便您的最终用户将其视为 IDataAdapter 的一部分。简单、干净。

      【讨论】:

        【解决方案3】:

        您可以使用 IoC(例如 structuremap)在表示层中注册 IDataAdapter 的特定实现。

        另一种方法可能是MEF,因此您可以随时交换程序集。

        【讨论】:

          猜你喜欢
          • 2011-06-16
          • 2014-04-23
          • 2012-09-10
          • 1970-01-01
          • 2013-08-07
          • 2021-02-11
          • 2011-02-23
          • 2020-11-28
          • 1970-01-01
          相关资源
          最近更新 更多