學習了Spring.NET+NHibernate的框架,覺得Spring.NET框架不夠輕量,配置來配置去的比較頭疼,所以把Spring.NET換成了Autofac框架,同時加入WCF框架整了一個組合。 本來想把NHibernate換成EF的,因為現在普通用的.net 4.0,但是.net 4.0里 ...
學習了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