我想知道您對我們計劃的這一部分的認識:這是一個好的設計嗎?
我們在我們的數據庫中有一個營地列表。
合作伙伴打電話給我們,讓所有營地附近的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沒有那麼好笑:)
那麼你怎麼看?清楚嗎 ?你有任何我應該看看的模式嗎?
如果事情是不明確的請諮詢
我的GPS過濾器是在距離上,所以我將不得不爲GPS_latitude字段創建一個距離標準。但無論如何我明白。謝謝 – 2010-03-19 16:01:53