mysql basedal_MongoDB的三层操作

今天也不知道哪根筋不对了,没有打Dota却想写一篇文章,其实自己也不知道写什么,专业技术较水,但真的很想写,自己文采又不够,所以还是只能写技术方面的文章啦!半瓶子还是可以晃荡晃荡的哈哈~ NOSQL近来势头不错,MongoDB更是其中的娇娇者,自己学nosql的

今天也不知道哪根筋不对了,没有打Dota却想写一篇文章,其实自己也不知道写什么,专业技术较水,但真的很想写,自己文采又不够,所以还是只能写技术方面的文章啦!半瓶子还是可以晃荡晃荡的哈哈~

NOSQL近来势头不错,MongoDB更是其中的娇娇者,自己学nosql的时候也是参考了大量的资料,最终决定要从MongoDB入手的,最重要的原因有两点:1自己是简单的爱好者,一切问题我都在想是否有简单的方法解决,宁可停下来去思考大量时间,也不愿用笨方法马上去做,而MongoDB的操作大都很简单,2自己是JS的爱好者,没事就喜欢拿一本js的本从头到尾看一边,也不管记住多少,也不管用不用得到,就是喜欢,MongoDB以BSON格式存储,所以操作也起来也算得心应手!现在做一个项目正是用MongoDB做为数据库的,一开始没有DAL,BLL直接访问数据库,然后就到UI了,香港空间,而且BLL是全静态的(我喜欢静态方法的调用简单,但狠静态类的不能继承!),当时考虑的是用MongoDB的驱动去操作太直白了!感觉没必要再写个DAL!,后来知道我想法还是很天真的,哈哈!下面就说现在的操作方式吧~

一、Module层

[Serializable]user

{publicObjectId id;public stringn;public intage;publicBirthday birth;Birthday

{public inty;public intm;public intd;

}

}

咋一看,虚拟主机,有几个地方不规范,1类名首字母和公开字段没有大写,2公开的字段,而没有用属性,3字段命名没表达它的意思。现在逐个解释一下,类名和字段没大写首字母主要是数据库里的命名是遵循js的,用js表示时大家一般会这样写:

var user={id:ObjectId("123456"),n:"loogn",age:23,birth:{y:1989,m:7,d:7}}

然而,可能有人会说可以用MongoDB.Bson.Serialization.Attributes.BsonElement这样一个Attribute关联呢!不过我不会那样做,原因就是太麻烦了!这里可能还是有疑问,留到第3个问题说。

公开字段而没有用属性也是不合常理的,学校老师都交过,不管你能不能理解,反正就是要私有化字段,想公开请用属性,哈哈!不过我想了很久还是不走寻常路了,目前为止用字段没有出现过缺陷问题,我不保证以后不会,但我感觉几率十分小,就算真的有什么问题必需要用属性,后面加上{get;set;}也不麻烦吧!属性毕竟还是方法,用属性有多余的方法调用开销,而且实体类本来就是不寻常的类,一般只表示对象状态(用字段),属性里如果有逻辑(就像老师常说的年龄不能小于0且不能大于150等等!),你会放到这里做吗?显然你都是放在BLL里做!字段命名太短了没有表达它的意思,其实这个可以和第一个一起来说,MongoDB是无模式的,同一个合集可以保多个不规则的文档,如user集合:

{id:1,n:"user1",desc:"我的描述"}

{id:2,n:"user2"}

所以数据库必须保存文档的每一个元素的name(即id,name,desc,id,name),所以元素name越短越节省空间,本来是用name更能表达的,这里用了n,其实只要把常用的约定一下,绝大部分人都是可以接受的。

在user里还有个内嵌类Birthday,而这个类大写了首字母,我是这样考虑的,内嵌类名全部按C#命名规范,因为容器类有一个该内嵌类类型的字段,这里是birth,但如果找不到合适的缩写怎么办呢,直接小写内嵌类名就可以了,如内嵌城市类City,字段名为city就不会重复了。

二、DAL层

在这一层要写一个基类,完成这个基类后,其他的各各DAL类都是浮云了~,在写基类之前有一个MongoHelper,MongoHelper很简单,直接给出代码且不写解释:

MongoServer

public classMongoHelper

{static readonlyMongoConnectionStringBuilder ConnectionStringBuilder;staticMongoHelper()

{] != null)

{

ConnectionStringBuilder= ].ConnectionString);

}] != null)

{

ConnectionStringBuilder= ].ConnectionString);

}else{);

}

}public static MongoServer GetServer(stringconnectionString)

{var server =MongoServer.Create(connectionString);returnserver;

}public staticMongoServer GetServer()

{var server =MongoServer.Create(ConnectionStringBuilder);returnserver;

}public static MongoDatabase GetDatabase(stringdatabaseName)

{returnGetServer().GetDatabase(databaseName);

}public staticMongoDatabase GetDatabase()

{returnGetDatabase(ConnectionStringBuilder.DatabaseName);

}

}

完了后就可以写BaseDAL了,如果没有泛型,DAL的工作还真是索然无味,但现在用泛型DAL的工作有趣多了,先承上代码:

数据访问层基类BaseDAL{CollectionName { set; get; }设置集合名SetCollectionName();private MongoCollectionm_collection;根据CollectionName得到MongoCollection对象MongoCollectionCollection

{get{if (m_collection == null)

{

CollectionName=SetCollectionName();

m_collection= MongoHelper.GetDatabase().GetCollection(CollectionName);

}returnm_collection;

}

}根据query条件得到一个文档对象TDocument FindOne(IMongoQuery query, PreprocessHandlerpreprocess)

{var document =Collection.FindOne(query);if (preprocess != null)

{

preprocess(refdocument);

}returndocument;

}把MongoCursor转换成IList类型IListCursorToList(MongoCursorcursor, PreprocessHandlerpreprocess)

{

IListlist = new List(30);bool isPreprocess = preprocess != null;foreach (TDocument document incursor)

{var doc =document;if(isPreprocess)

preprocess(refdoc);

list.Add(doc);

}returnlist;

}根据query查询集合IListFind(IMongoQuery query, MongoCursorSettings cursorSettings, PreprocessHandlerpreprocess)

{var cursor =Collection.Find(query);if (cursorSettings != null)

{

cursorSettings.Set(cursor);

}var list =CursorToList(cursor, preprocess);returnlist;

}

}

f68f2add0b68e4f9810432fce46917b7.png

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值