2010-11-24 19 views
1

Web、モバイル(オフライン)とデスクトップ(オフライン)の3つのプレゼンテーション層に存在するアプリケーションがあります。コアビジネスオブジェクトは3つすべてで同じで、同じ検証およびビジネスルールを共有します。しかし、それらはすべて異なるデータベース(Web - SQL Server 2008、モバイル/デスクトップ - SQL Compact)を使用します。同期プロセスを通じて、デスクトップアプリケーションとモバイルアプリケーションは、サーバーのSQL 2008 dbからデータをプッシュして受信します。一般的なビジネス層のN層設計(異なるプレゼンテーションとデータ層)

私は最高のn層アプローチを思いついていると私はちょっと立ち往生しています。すべてのビジネスルールをカプセル化するビジネスオブジェクトのアセンブリを作成しました。このアセンブリの各オブジェクトにSave()メソッドを持たせたいと思います。しかし、私はこのレイヤーに特定のデータレイヤーを認識させたくありません。基本的には、これら3つのプレゼンテーションレイヤーにこれらのオブジェクトを設定し、Save()メソッドを呼び出すことが必要です。しかし、私はSave()メソッドの実装を呼び出すアプリケーションによって異なるものにしたいと思います。

最初にIDataAdapterというインターフェイスを作成し、IDataAdapterの各オブジェクトに静的プロパティを作成しました。 Save()メソッドは、これが設定されているかどうかをチェックしてから、Businessオブジェクトを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

私はシンプルなファンです。

あなたができることの1つは、Saveメソッドをプラットフォーム依存のアセンブリに分けるだけです。それを拡張メソッドにして、エンドユーザーにはIDataAdapterの一部のように見えるようにします。シンプルで清潔。

0

IoC(例:structuremap)を使用して、プレゼンテーション層にIDataAdapterの固有の実装を登録できます。

他の方法はMEFであるため、必要なときにアセンブリを交換することができます。基づい

1

あなたは異なる層が お互いを知っているべきではないことを「最高のn階層アプローチ」 を意味し、部品を互いにリンクする唯一の方法がある場合は、グローバルデータアダプター、レジストリを作成することができます 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()); 

     } 
    } 

あなたはハードコード、コンパイル時初期化のinstad XML-configurtaionファイルでこれを行うためにspring.netのような「反転コントロールコンテナの」フレームワークを使用することができます。

関連する問題