2010-03-19 121 views
2

我想知道您對我們計劃的這一部分的認識:這是一個好的設計嗎?

我們在我們的數據庫中有一個營地列表。

合作伙伴打電話給我們,讓所有營地附近的GPS位置或所有提供酒吧的營地(我們稱之爲服務)。

那麼我是如何意識到的呢?

這裏是我們的數據庫:

Campsite 
- ID 
- NAME 
- GPS_latitude 
- GPS_longitude 

CampsiteServices 
-Campsite_ID 
-Services_ID 

所以我的代碼(C#,但它是不相關的,我們說這是一個面向對象的語言)看起來像這樣

public class SqlCodeCampsiteFilter{ 
    public string SqlCode; 
    public Dictionary<string, object> Parameters; 
} 

interface ISQLCampsiteFilter{ 
    SqlCodeEngineCore CreateSQLCode(); 
} 

public class GpsLocationFilter : ISQLCampsiteFilter{ 
    public float? GpsLatitude; 
    public float? GpsLongitude; 
    public SqlCodeEngineCore CreateSQLCode() 
      { 
    --return an sql code to filter on the gps location like dbo.getDistance(@gpsLat,@gpsLong,campsite.GPS_latitude,campsite.GPS_longitude) with the parameters 
    } 
} 
public class ServiceFilter : : ISQLCampsiteFilter{ 
    public int[] RequiredServicesID; 
    public SqlCodeEngineCore CreateSQLCode() 
      { 
    --return an sql code to filter on the services "where ID IN (select CampsiteServices.Service_ID FROm CampsiteServices WHERE Service_ID in ...) 
    } 
} 

所以在我的web服務代碼:

List<ISQLFilterEngineCore> filters = new List<ISQLFilterEngineCore>(); 
if(gps_latitude.hasvalue && gps_longitude.hasvalue){ 
    filters.Add (new GpsLocationFilter (gps_latitude.value,gps_longitude.value)); 
} 
if(required_services_id != null){ 
    filters.Add (new ServiceFilter (required_services_id)); 
} 
string sql = "SELECT ID,NAME FROM campsite where 1=1" 
foreach(ISQLFilterEngineCore aFilter in filters){ 
    SqlCodeCampsiteFilter code = aFilter.CreateSQLCode(); 
    sql += code.SqlCode; 
    mySqlCommand.AddParameters(code.Parameters);//add all the parameters to the sql command 
} 
return mySqlCommand.GetResults(); 

1)我不使用ORM的原因很簡單,因爲該系統自10年以來就存在並且是唯一的開發者從一開始他就在這裏開始瞭解公共和私人之間的區別。
2)我不喜歡SP,因爲:我們可以重寫,並且t-sql沒有那麼好笑:)

那麼你怎麼看?清楚嗎 ?你有任何我應該看看的模式嗎?

如果事情是不明確的請諮詢

回答

2

看起來相當清楚,並有可能工作。它與查詢對象模式有一點不同(參見Fowler,Martin 企業架構模式。Addison Wesley,2003),但不是太遙遠。

它有一個名爲Query的類,它具有Criterion對象的集合。

的標準對象將有運營商,現場和過濾器值以過濾(在Java中,不好意思):

Class FloatCriterion implements Criterion { 
    String _operator; // = "=" 
    String _fieldName; // = "GPS_latitude" 
    Float _value;  // = 43.21 

    String getSql(){ 
     // build the where criteria 
    } 
    Param getValue(){ 
     // return the param value 
    } 
} 

查詢對象將有你的基本查詢:

Class CampsiteQuery implements Query { 
    String _baseQuery = "SELECT ID,NAME FROM campsite where 1=1" 
    Collection<Criteria> _criteria; 

    void addCriterion(Criterion crit) { 
     _criteria.add(crit); 
    } 

    String buildSql{ 
     // concat _baseQuery with each Criterion.getSql 
    } 

    List<Param> getParams { 
     // build list of params from criteria 
    } 

    List<Campsite> get Results { 

    } 

} 

從那裏應該有一個服務,將接受查詢,並做數據庫交談的工作。

這會讓你處於一個轉移到ORM工具的位置,當你到達這一點時會變得更加艱難。

+0

我的GPS過濾器是在距離上,所以我將不得不爲GPS_latitude字段創建一個距離標準。但無論如何我明白。謝謝 – 2010-03-19 16:01:53

相關問題