2009-07-29 12 views
2

私はSql ServerとOracleをサポートする必要があるアプリケーションのデータベースファクトリパターンを作成しています。私は、アプリケーションのすべてのSQLクエリを持つ抽象クラスを持っています。抽象クラスをSqlServerClassとOracleClassという2つのクラスに実装しました。構成ファイルで定義された接続文字列に基づいて、アプリケーションは対応するクラスのインスタンスを作成し、データベースのSqlクエリを取得します。 1は、簡単に特定の機能のために使用されるSQLクエリを識別できるように抽象クラスのグループメソッド

public abstract class ProviderFactory 
    { 
     public abstract string GetCustomersSql(); 
     public abstract string GetCustomersByIdSql(); 
     public abstract string GetUsersSql(); 
     public abstract string GetUsersByIdSql(); 
    } 

    public class OracleClass : ProviderFactory 
    { 
     public override string GetCustomersSql() 
     { 
      // return sql query for Oracle 
     } 
     // other methods 
    } 
    public class SqlServerClass : ProviderFactory 
    { 
     public override string GetCustomersSql() 
     { 
      // return sql query for Sql Server 
     } 
     // other methods 
    } 

今、私の質問は、グループへの道は、抽象クラスでこれらのSQLクエリがあります。たとえば、することができます私のグループ私は、有効なアプローチここでやっているすべての顧客に関連するクエリとクエリ私はそれらを参照するとき、それは同じようになるように関連するユーザー....

ProviderFactory instance; 
// create an instance 
instance.Customers.GetCustomersSql(); 

はありますか?提案してください。ありがとうございました。

答えて

3

NHibernateなどのORMを使用することを強くお勧めします。それはsupports both SQL Server and Oracleと2つの間の違いを抽象化します。

これは、NHibernateが理解している形式で一度クエリを書くだけで、SQL ServerとOracleが理解できるバージョンに変換するということです。

あなたは何ができるかあなたの現在の道を続けたい場合は、私は、クエリディレクトリを呼びたいものを作成することです:

public interface IQueryDirectory 
{ 
    ICustomerQueries Customer { get; } 
    IUserQueries User { get; } 
} 

public interface ICustomerQueries 
{ 
    string Customers { get; } 
    string CustomersById { get; } 
} 

public interface IUserQueries 
{ 
    string Users { get; } 
    string UsersById { get; } 
} 

実装例:

public abstract class QueryDirectory : IQueryDirectory 
{ 
    private ICustomerQueries customer; 
    private IUserQueries user; 

    public ICustomerQueries Customer 
    { 
     get { return customer; } 
    } 

    public IUserQueries User 
    { 
     get { return user; } 
    } 

    protected QueryDirectory(ICustomerQueries customer, IUserQueries user) 
    { 
     this.customer = customer; 
     this.user = user; 
    } 
} 

public class SqlServerQueryDirectory : QueryDirectory 
{ 
    public SqlServerQueryDirectory(SqlServerCustomerQueries customer, 
     SqlServerUserQueries user) : base(customer, user) {} 
} 

public class SqlServerCustomerQueries : ICustomerQueries 
{ 
    public string Customers 
    { 
     get "some sql"; 
    } 

    public string CustomersById 
    { 
     get "some sql"; 
    } 
} 

を次にあなたが実装することができます各データベースごとに別々にディレクトリを作成します。しかし正直なところ、ORMを代わりに使用することを本当に、本当にお勧めします。

+0

こんにちはGarry、ありがとうございました。私はORMのアプローチが好きですが、再帰的クエリや共通テーブル式などの複雑なクエリを使用します。これらのクエリをサポートするためにNHibernateを使用できますか?また、元のアプローチでは、OracleClassおよびSqlServerClassクラスのインタフェースのメソッドをどのように実装できますか?どうもありがとう。 –

+0

本当に複雑なクエリにNHibernateを使用することはできませんが、通常のプロジェクトでは95%のクエリを実行できます。データベース間で95%を簡単に維持できるようにすることで、心配する必要が少なくなります。 NHibernateでは、必要に応じてデータベースに直接コールすることができますので、他の場所でデータベースを相互に実装する利点がある一方、扱いにくい領域でデータベースごとのアプローチを使用できます。 –

+0

ありがとうGarry、それは本当に助けになりました。上記のコードは完全に機能します。また、NHibernateの使用を実際に検討します。 –