在這炮火連天、技術更新迅猛的年代,不接觸瞭解、甚至會用2~3種框架都很差意思說本身有多少年工做經驗。何況出去面試也會有點吹牛的底子嘛。html
此次折騰了NHibernate、其實這些ORM框架封裝好了都是給人用的。基本的也不會太難,深究就暫時不談。主要是要有一雙善於發現技術點的眼睛、和對新技術的渴望。或者經過一個平臺去了解。好比說:我上次看了 金三銀四,分享本身找工做的經歷 這篇文章,裏面講到面試官問到了用過哪些ORM框架。樓主提到了Dapper,我就來了興趣,開始查詢有關資料。固然這篇文章不是折騰Dapper的、之後可能會繼續折騰。git
因此,我此次寫了這篇關於NHibernate的文章、也提到了Dapper,會不會也有人去了解去研究這些東西呢?面試
習慣了EF、接觸到NHibernate忽然就以爲怎麼這麼多配置呢。好麻煩的說。sql
此次我不僅是提到單純的NHibernate的運用。還加入了一點有關Repository倉儲的東西,我也是懂一點而已。正好寫出來讓你們看看不足之處。但願別誤導你們,有錯誤之處請指出。謝謝!數據庫
本身沒事搭的小框架、適合本身用、方便就好。你們有什麼指出的請在下方留言。也但願給一些意見和建議,好比好的文章和書。如今是學習的階段,但願能獲得好心人的幫助。謝謝你們!session
源碼在這裏!源碼(沒有Ninject、正好能夠本身試試)數據結構
NHibernate是一個面向.NET環境的對象/關係數據庫映射工具。對象/關係數據庫映射(object/relational mapping,ORM)這個術語表示一種技術,用來把對象模型表示的對象映射到基於SQL的關係模型數據結構中去。app
園子裏的文章:框架
西安_王磊:http://www.cnblogs.com/stone_w/archive/2011/09/15/2177830.htmlide
劉冬:http://www.cnblogs.com/GoodHelper/tag/NHibernate/
逆心:http://www.cnblogs.com/kissdodog/category/453550.html
按照教程配置應該不會有問題的
注意:
一、映射文件的屬性-->生成操做-->嵌入的資源
二、teamcity-hibernate.cfg.xml數據庫配置文件 -->複製到輸出目錄-->始終複製
添加一個User_Info實體類
public class User_Info { #region Model public virtual int User_ID { set; get; } public virtual string User_Name { set; get; } public virtual string Password { set; get; } public virtual string Mobile { set; get; } public virtual string Source { set; get; } public virtual float Lat { set; get; } public virtual float Lng { set; get; } public virtual string Weixin_NickName { set; get; } public virtual string Weixin_OpenID { set; get; } public virtual string Role_Code { set; get; } public virtual int Login_Count { set; get; } public virtual DateTime LastLogin_Date { set; get; } public virtual string LastLogin_IP { set; get; } public virtual string Create_IP { set; get; } public virtual DateTime Create_Date { set; get; } public virtual int Status { set; get; } #endregion Model }
映射文件配置詳情說明:NHibernate之映射文件配置說明
添加User_Info實體類對應的映射文件、和對應的字段屬性同樣便可,類型必須同樣
<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" > <class name="LX.NHibernate.Data.Domain.User_Info,LX.NHibernate.Data.Domain" table="User_Info" lazy="true" > <id name="User_ID" column="User_ID" type="int" > <generator class="native"/> </id> <property name="User_Name" type="string"> <column name="User_Name" length="50"/> </property> <property name="Password" type="string"> <column name="Password" length="50"/> </property> <property name="Mobile" type="string"> <column name="Mobile" length="50"/> </property> <property name="Source" type="string"> <column name="Source"/> </property> <property name="Lat" type="float"> <column name="Lat"/> </property> <property name="Lng" type="float"> <column name="Lng"/> </property> <property name="Weixin_NickName" type="string"> <column name="Weixin_NickName" length="200"/> </property> <property name="Weixin_OpenID" type="string"> <column name="Weixin_OpenID" length="200"/> </property> <property name="Role_Code" type="string"> <column name="Role_Code" length="50"/> </property> <property name="Login_Count" type="int"> <column name="Login_Count"/> </property> <property name="LastLogin_IP" type="string"> <column name="LastLogin_IP"/> </property> <property name="Create_IP" type="string"> <column name="Create_IP"/> </property> <property name="Create_Date" type="DateTime"> <column name="Create_Date"/> </property> <property name="LastLogin_Date" type="DateTime"> <column name="LastLogin_Date"/> </property> <property name="Status" type="int"> <column name="Status" /> </property> </class> </hibernate-mapping>
teamcity-hibernate.cfg.xml 相似Config
配置說明詳情:NHibernate之配置文件屬性說明
數據庫連接字符串核心:connection.connection_string
<?xml version="1.0" encoding="utf-8" ?> <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> <bytecode-provider type="lcg"/> <reflection-optimizer use="true"/> <session-factory name="LX.NHibernate"> <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property> <property name="cache.provider_class">NHibernate.Cache.HashtableCacheProvider, NHibernate</property> <property name="cache.use_query_cache">true</property> <property name="query.startup_check">false</property> <!-- The valid strings for Isolation can be found in the documentation for the System.Data.IsolationLevel Enumeration documentation. Use the member names - not the values. --> <property name="adonet.batch_size">10</property> <property name="connection.isolation">ReadCommitted</property> <property name="format_sql">true</property> <!-- This is the System.Data.dll provider for MSSQL Server --> <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property> <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property> <!--<property name="dialect">NHibernate.Dialect.MySQLDialect</property>--> <property name="connection.connection_string"> server=DIANSHISZH\DATA2008;database=test;initial catalog=test;user id=sa;password=123456 </property> <property name="show_sql">false</property> <property name="command_timeout">444</property> <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property> <property name="adonet.wrap_result_sets">false</property> <mapping assembly="LX.NHibernate.Data.Domain"/> </session-factory> </hibernate-configuration>
dll在源碼裏面有提供
看看底層的寫法
ISessionFactory sessionFactory = new Configuration().Configure(AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "/Config/teamcity-hibernate.cfg.xml").BuildSessionFactory(); public object Insert(T entity) { using (ISession session = sessionFactory.OpenSession()) { var id = session.Save(entity); session.Flush(); return id; } } public void Update(T entity) { using (ISession session = sessionFactory.OpenSession()) { session.Update(entity); session.Flush(); } } public void Delete(T entity) { using (ISession session = sessionFactory.OpenSession()) { session.Delete(entity); session.Flush(); } } public T Get(object id) { using (ISession session = sessionFactory.OpenSession()) { return session.Get<T>(id); } } public T Load(object id) { using (ISession session = sessionFactory.OpenSession()) { return session.Load<T>(id); } } public List<T> LoadAll() { using (ISession session = sessionFactory.OpenSession()) { return session.QueryOver<T>().List().ToList(); } }
既然是瞎折騰嘛、那我加入Ninject 玩玩試試!
Ninject是一個IOC容器用來解決程序中組件的耦合問題,它的目的在於作到最少配置。其餘的的IOC工具過於依賴配置文件,須要使用assembly-qualified名稱來進行定義,庸長且複雜經常由於打錯字而破壞程序。這些是他的優勢,也是爲何要選擇它。Ninject同時不能進行熱插拔。
園子裏的文章學習借鑑:
Tyler‘s Blog:http://www.cnblogs.com/tylerdonet/p/3297915.html
Liam Wang :http://www.cnblogs.com/willick/p/3299077.html
一、咱們先建立一個NinjectControllerFactory 工廠類
public class NinjectControllerFactory : DefaultControllerFactory { private IKernel ninjectKernel; public NinjectControllerFactory() { ninjectKernel = new StandardKernel(); AddBindings(); } protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) { return controllerType == null ? null : (IController)ninjectKernel.Get(controllerType); } private void AddBindings() { // todo:後面再來添加綁定 ninjectKernel.Bind<LX.NHibernate.Service.IUser_InfoManage>().To<LX.NHibernate.Service.Implement.User_InfoManage>(); } }
二、在Global.asax文件Application_Start方法裏面註冊一個全局
ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());
工廠類的AddBindings() 方法的做用就是注入。讓咱們看看開始寫的代碼以下:
咱們在調用Service層方法的時候得new一個對象。
private IUser_InfoManage userInfoService = new User_InfoManage(); public ActionResult Index() { LX.NHibernate.Data.Domain.User_Info model = userInfoService.GetUser_Info(1017); return View(model); }
如今呢?咱們可使用Ninject注入幫咱們完成new那步操做
private IUser_InfoManage userInfoService; public UserController(User_InfoManage userService) { userInfoService = userService; }
其實,我我的以爲哈,好像並無省事到哪裏去,還不如直接new呢。呵呵,典型的屌絲氣質!你們有什麼好的關於Ninject的文章也能夠推薦一下、謝謝!
一、添加了通用分頁方法以及分頁條
二、添加Log4Net日誌記錄功能
一個項目須要的大體功能差很少就這些了吧。
你們有什麼指出的請在下方留言。也但願給一些意見和建議,好比好的文章和書。如今是學習的階段,但願能獲得好心人的幫助。謝謝你們!
GIT獲取源碼:https://git.oschina.net/lxsweat/LX.NHibernate.V1_Company.git (git 上面的版本可能會及時完善代碼和功能)
點擊下載:源碼(沒有Ninject、正好能夠本身試試,網盤的代碼不維護完善功能)