ASP.NET MVC+WCF+NHibernate+Autofac 框架組合(一)


學習了Spring.NET+NHibernate的框架,覺得Spring.NET框架不夠輕量,配置來配置去的比較頭疼,所以把Spring.NET換成了Autofac框架,同時加入WCF框架整了一個組合。

本來想把NHibernate換成EF的,因為現在普通用的.net 4.0,但是.net 4.0里的EF對Oracle支持沒那么好,.net4.5有了oracle新的驅動就挺好用了。

一點點心得,NHibernate也是剛熟悉,給像我一樣的新手參考,一起學習,有什么不夠合理的地方還請多多指教。

數據庫為 Oracle11G, NHibernate版本 3.2,.net 4.0

源碼中

clientApp +Manager+Repository+Model 是前面Spring.NET+NHibernate寫的。

Model:實體

Repository:持久層,抽象數據庫操作,其中

IRepository是增刪改的接口類,

NHibernateRepository是使用是NHibernate的數據庫操作模板,模板類封裝了對數據庫的操作(Spring.NET的這套用的此類)。

RepositotyBase是沒使用模板,利用NHibernate的核心類對數據庫進行操作。與NHibernateRepository性質一樣(Autofac的那套用的此類)。

Manager:業務層,Repository的具體業務類。

clientApp:控制台客戶端

后面Spring.NET換成了Autofac后這一套程序可能編譯不通過了。

 

AutofacMvc+Service+BLL+Repository+Model是 MVC+WCF+Autofac+NHibernate寫的一套框架。

Repository,Model與上面是共用的

BLL:業務層

Service:服務層,WCF服務應用程序

下面逐一講解:

 

Model:

  每個實體都對應一個.hbm.xml配置文件,NHibernate根據此文件信息與數據庫進行映射,NHibernate不同版本配置會有區別。

  配置文件 的生成操作改成“嵌入的資源”

Repository:

  Repository.xml 如果是用Spring.Net+NHibernate,那么個文件是必須的,里面配置NHibernate相關屬性,及以Spring.NET注入的相關屬性。

  RepositotyBase是本套框架調用的數據庫操作類,該類構造函數的參數是三個NHibernate的核心類,用來用Autofac進行實例化。

BLL:

  UserBLL:構造函數參數為IRepository,也是為了用Autofac注入的。

Service:

hibernate.cfg.xml 是NHibernate的數據庫配置 ,文件名是固定的。數據庫是oracle11g(該配置也可寫在web.config文件里。我是用的web.config里的配置).

packages.config 是Autofac的配置文件

Global.asax里的代碼如下,

   public static IContainer container = null;

 protected void Application_Start(object sender, EventArgs e)
        {
            Configuration config = new Configuration();

    //如果是用hibernate.cfg.xml的配置,則該行代碼為 Configuration config = new Configuration().Configure();
            config.AddAssembly("Model");//加載實體程序集。
            ISessionFactory sessionFactory = config.BuildSessionFactory();
            ISession session= sessionFactory.OpenSession();
            ContainerBuilder builder = new ContainerBuilder();
    //以上是構造出NHibernate的核心類實例
            builder.RegisterInstance(config).As<Configuration>().SingleInstance();
            builder.RegisterInstance(sessionFactory).As<ISessionFactory>().SingleInstance();
            builder.Register(x => x.Resolve<ISessionFactory>().OpenSession()).As<ISession>().InstancePerLifetimeScope();
    //將NHibernate的核心類實例注入到容器


            builder.Register(c => new RepositotyBase<User>(c.Resolve<Configuration>(), c.Resolve<ISession>(), c.Resolve<ISessionFactory>())).As<IRepository<User>>();
            builder.Register(c => new UserBLL(c.Resolve<IRepository<User>>())).InstancePerDependency();
            container = builder.Build();
            //將業務層及數據層的操作類注入到容器
            var csl = new AutofacServiceLocator(container);
            ServiceLocator.SetLocatorProvider(() => csl);
        }

 protected void Application_End(object sender, EventArgs e)
        {
            if (container != null)
            {
                container.Dispose();
                container = null;
            }
        }//程序退出釋放資源

UserManager.svc:

 服務類里:UserBLL userBll = ServiceLocator.Current.GetInstance<UserBLL>();獲得業務層類的實例進行業務操作。

至此服務端的代碼完成。只測試了User業務。客戶端的MVC里后面再寫上。編譯時如果發生未找到Oracle.DataAccess.dll,NHibernate錯誤,將dll文件放入bin文件。

源代碼:http://files.cnblogs.com/files/lm-nice/SpringNet_NHibernate.7z

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM