学习了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