瞎折騰之 NHibernate ORM框架的接觸(MVC + Repository源碼)(一)

  在這炮火連天、技術更新迅猛的年代,不接觸瞭解、甚至會用2~3種框架都很差意思說本身有多少年工做經驗。何況出去面試也會有點吹牛的底子嘛。html

  此次折騰了NHibernate、其實這些ORM框架封裝好了都是給人用的。基本的也不會太難,深究就暫時不談。主要是要有一雙善於發現技術點的眼睛、和對新技術的渴望。或者經過一個平臺去了解。好比說:我上次看了 金三銀四,分享本身找工做的經歷 這篇文章,裏面講到面試官問到了用過哪些ORM框架。樓主提到了Dapper,我就來了興趣,開始查詢有關資料。固然這篇文章不是折騰Dapper的、之後可能會繼續折騰。git

  因此,我此次寫了這篇關於NHibernate的文章、也提到了Dapper,會不會也有人去了解去研究這些東西呢?面試

  習慣了EF、接觸到NHibernate忽然就以爲怎麼這麼多配置呢。好麻煩的說。sql

  此次我不僅是提到單純的NHibernate的運用。還加入了一點有關Repository倉儲的東西,我也是懂一點而已。正好寫出來讓你們看看不足之處。但願別誤導你們,有錯誤之處請指出。謝謝!數據庫

小型框架截圖

  本身沒事搭的小框架、適合本身用、方便就好。你們有什麼指出的請在下方留言。也但願給一些意見和建議,好比好的文章和書。如今是學習的階段,但願能獲得好心人的幫助。謝謝你們!session

源碼在這裏!源碼(沒有Ninject、正好能夠本身試試)數據結構

什麼是NHibernate?

  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
    }
View Code

映射文件配置詳情說明: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>
View Code

配置數據庫

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資源

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 ?爲何要用?

  Ninject是一個IOC容器用來解決程序中組件的耦合問題,它的目的在於作到最少配置。其餘的的IOC工具過於依賴配置文件,須要使用assembly-qualified名稱來進行定義,庸長且複雜經常由於打錯字而破壞程序。這些是他的優勢,也是爲何要選擇它。Ninject同時不能進行熱插拔。

園子裏的文章學習借鑑:

Tyler‘s Bloghttp://www.cnblogs.com/tylerdonet/p/3297915.html

Liam Wang :http://www.cnblogs.com/willick/p/3299077.html

使用Ninject

一、咱們先建立一個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的文章也能夠推薦一下、謝謝!

 

更新於2015-04-23 15:15

一、添加了通用分頁方法以及分頁條

二、添加Log4Net日誌記錄功能

一個項目須要的大體功能差很少就這些了吧。

 

總結

你們有什麼指出的請在下方留言。也但願給一些意見和建議,好比好的文章和書。如今是學習的階段,但願能獲得好心人的幫助。謝謝你們!

源碼下載

GIT獲取源碼:https://git.oschina.net/lxsweat/LX.NHibernate.V1_Company.git (git 上面的版本可能會及時完善代碼和功能)

點擊下載:源碼(沒有Ninject、正好能夠本身試試,網盤的代碼不維護完善功能)

 

原文來自:http://www.cnblogs.com/lxsweat/p/4447154.html 

相關文章
相關標籤/搜索