我想知道您对我们计划的这一部分的看法:
我们的数据库中有营地列表。
合作伙伴致电我们,让所有露营地都靠近GPS位置或所有提供酒吧的露营地(我们称之为服务)。
那我是怎么意识到的?
这是我们的数据库:
Campsite
- ID
- NAME
- GPS_latitude
- GPS_longitude
CampsiteServices
-Campsite_ID
-Services_ID
所以我的代码(c#,但它不相关,假设它是一种OO语言)看起来像这样
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 ...)
}
}
所以在我的网络服务代码中:
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使用起来不是那么有趣:)
那你觉得怎么样?清楚吗 ?你有任何我应该关注的模式吗?
如果不清楚,请询问
答案 0 :(得分:3)
看起来相当清楚,并且可能会奏效。它与查询对象模式略有不同(参见Fowler,Martin。企业架构模式 .Addison Wesley,2003),但距离不太远。
这有一个名为Query的类,它有一组Criterion对象。
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
}
}
Query对象将具有您的基本查询:
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工具将会稍微不那么艰难。