2010-11-24 60 views
1

我有一个存在于3种不同表示层中的应用程序... web,移动(脱机)和桌面(脱机)。这三个核心业务对象都是相同的,它们共享相同的验证和业务规则。但是,它们都使用不同的数据库(网络 - SQL Server 2008,移动/桌面 - SQL Compact)。通过同步过程,桌面和移动应用程序可以从服务器的SQL 2008数据库中推送和接收数据。针对通用业务层但不同表示层和数据层的N层设计

我试图想出最好的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); 
    } 
} 

当然,这是不理想的,因为表示层将需要具有以设定的适配器属性数据层的参考。我真的很喜欢有一些插件系统,我可以根据应用平台换出data.dll。

有没有人对如何实现这个更好一点有什么建议?

回答

0

我是Simple的忠实粉丝。

你可以做的一件事就是简单地将你的Save方法分解为平台相关的程序集。只需将其作为扩展方法,以便您的最终用户看起来像是他们的IDataAdapter的一部分。简单,干净。

0

可以使用IoC(例如structuremap)将IDataAdapter的特定实现注册到演示文稿层。

另一种方法可能是MEF,所以你可以在任何时候交换组件。

1

,如果你的意思是用“最好的n层的方法” ,不同的层不应该知道对方 ,并且只有一个部件连接在一起 您可以创建一个基于全球的DataAdapter的注册表 方法Dictionary

其中BusinessProxy可以要求使用其IDataAdapter。

 
    public interface IDataAdapter 
    { 
     void Save(BusinessProxy proxy); 
    } 

    public class BusinessProxy 
    { 
     public static DataAdapterRegistry Adapter = new DataAdapterRegistry(); 

     public bool Save() 
     { 
      Adapter.Save(this); 
      return true; 
     } 
    } 

    public class DataAdapterRegistry : IDataAdapter 
    { 
     private Dictionary<Type, IDataAdapter> registry 
            = new Dictionary<Type, IDataAdapter>(); 

     public void Register(Type type, IDataAdapter adapter) 
     { 
      registry[type] = adapter; 
     } 

     public void Save(BusinessProxy proxy) 
     { 
      IDataAdapter adapter; 
       if (registry.TryGetValue(proxy.GetType(), out adapter)) 
        adapter.Save(proxy); 
       else 
        throw new NotSupportedException(proxy.GetType().FullName);  
     } 
    } 

    class Customer : BusinessProxy 
    { 
    } 

    class Order : BusinessProxy 
    { 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      BusinessProxy.Adapter.Register(typeof(Customer), new CustomerAdapter()); 
      BusinessProxy.Adapter.Register(typeof(Order), new OrderAdapter()); 

     } 
    } 

你可以使用一个框架“控制容器的反转”像spring.net用硬编码,编译时初始化的XML-configurtaion文件instad做到这一点。