今天,我们来做一个asp.net mvc5 的事例项目,项目比较简单。
1.数据库我们使用oracle11G,因为很多文章介绍中都是使用sqlserver或者是mysql数据库,使用oracle的还是比较少,所以这里我合用oracle数据库。
2.通过使用dapper (orm)连接数据库并读取数据,Dapper是一个轻量级的ORM(对象关系映射)框架,用于将数据库中的数据映射到.NET应用程序中的对象模型。它可以与多种关系型数据库(如SQL Server、MySQL、Oracle等)一起使用,并提供了简单、快速的方法来执行基本的CRUD操作(增删改查),同时也支持存储过程和动态SQL。Dapper相对于其他ORM框架的优点是速度更快、更轻量级、更易于学习和使用。
3.使用autofac 来进行依赖注入。依赖注入(DI)是一种设计模式,它可以用来解决以下问题:
3.1.松耦合:依赖注入可以减少类之间的耦合度,使类之间的关系更加松散。通过将依赖项注入、分离和管理,可以更容易地替换、更新或删除依赖项,而不会影响其他类。
3.2.可测试性:依赖注入可以使代码更易于测试。通过注入模拟对象或依赖项,可以更轻松地模拟和测试代码,从而提高代码的可测试性和可维护性。
3.3.可复用性:依赖注入可以使代码更容易重用。通过将依赖项注入到一个类中,可以更容易地将这个类用于不同的场景和应用程序中。
3.4.可扩展性:依赖注入可以使代码更容易扩展。通过注入新的依赖项,可以很容易地添加新的功能或修改现有功能。
我在这里使用依赖注入主要是可以使代码更加灵活、易于测试、可重用和可扩展,从而提高代码的质量和可维护性。
4.使用repository仓储层开发模式。仓库(Repository)是一个将应用程序与数据源隔离开来的模式,使得应用程序与底层数据源之间的交互完全由仓库进行。
仓库层开发模式是指在应用程序中,数据从数据库或其他数据源中获取时,通过定义一个仓库层来实现这个过程。该层通常是一个中间层,通过处理业务逻辑和数据操作来实现应用程序的各种功能。
在仓库层模式中,应用程序和数据源之间的通信完全由仓库层进行处理。这使得仓库层可以轻松地更改底层数据源,而不会对应用程序产生任何影响。
在仓库层开发模式中,通常会使用一些设计模式来实现数据的存储和检索,例如工厂模式、单例模式、观察者模式等。
5.使用 Oracle.ManagedDataAccess 连接 Oracle 数据库,Oracle.ManagedDataAccess 是一个针对 .NET 程序开发的数据库访问驱动库,此驱动为我们提供了一系列的类和方法,用于连接、查询和操作 Oracle 数据库。相较于以往的驱动程序(如 Oracle.DataAccess), Oracle.ManagedDataAccess 具有更好的性能、更高的稳定性和更好的兼容性,而且最方便的是它可以直接数据库,也不用安装ORACLE客户端程序。并且支持在各种操作系统中运行,为我们提供了极大的便利。
6.前端界面使用adminlte3.0来做展示。adminlte是一个非常流行的前端框架,最主要是它是免费的,最新版的adminlte3.2比2.x版本速度以及各方面都有了巨大的提升。
好了,话不多说,开始我们今天的编程之旅吧。
第一步:首先我们在我们的ORACLE数据库中新建一张BOOK的图书表:
-- Create table
create table BOOK
(
bookid NUMBER not null,
isbn NVARCHAR2(50),
bookname NVARCHAR2(200),
booktype NVARCHAR2(200),
author NVARCHAR2(50),
publishing NVARCHAR2(50),
price NUMBER,
isdelete NUMBER,
updatedate DATE,
adddate DATE
)
tablespace USERS
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
next 1M
minextents 1
maxextents unlimited
);
第二步:启动VS2022或者2019都可以,新建一个MVC的项目,项目名称为BookMvcTest
第三步:通用NUGET包管理程序引入相关的引用库DAPPER, AUTOFAC, ManagedDataAccess
第四步:引入ADMINLTE模板程序,并修改相应的模板。
直接将整个下载的ADMINLTE拖动到整个程序的根目录下即可。然后新一个一个布局文件,根据需要修改即可。这个比较简单就不上图了,如果有小伙伴对这方面有疑问,下一次专门写一篇这方面的文章。
第五步:在Modes文件夹中添加Book图书类
public class Book
{
public int Bookid { get; set; }
public string BookName { get; set; }
public string Isbn { get; set; }
public string BookType { get; set; }
public string Author { get; set; }
public string Publishing { get; set; }
public decimal Price { get; set; }
public DateTime? UpdateDate { get; set; }
public DateTime? AddDate { get; set; }
}
第六步:在项目中新建Repository目录,这里说明一个,由于是一个小项目,所以仓储层我们就直接建一目录了,而不重新建一个类库项目,如果是大的项目,还是建议大家新建一个类库项目来完成。在此目录中,我们新一个接口文件IRepository ,接口文件中包括常用操作。
public interface IRepository<T> where T : class
{
IEnumerable<T> GetAll(); //获取所有数据
T GetDetail(int id); //根据ID获取数据
int GetCount(); //获取数据总数
/// <summary>
/// 数据分页
/// </summary>
/// <param name="page"></param>
/// <param name="limit"></param>
/// <returns></returns>
IEnumerable<T> PageListQueryable(int page, int limit);
}
因为只做一个测试,增删改的操作这里就不一 一写出来了,方法都是相同。
在当前目录中新建BookRepository.cs类,用于Book仓储类。
代码如下:
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Web;
using BookMvcTest.Models;
using Oracle.ManagedDataAccess.Client;
using Dapper;
namespace BookMvcTest.Repository
{
public class BookRepository : IRepository<Book>
{
public string connectOracle = ConfigurationManager.ConnectionStrings["DbConnectionString"].ConnectionString;
public IEnumerable<Book> GetAll()
{
IEnumerable<Book> books = new List<Book>();
using (var connection = new OracleConnection(connectOracle))
{
connection.Open();
books = connection.Query<Book>("SELECT count(*) FROM Book");
connection.Close();
}
return books;
}
public int GetCount()
{
int count = 0;
using (var connection = new OracleConnection(connectOracle))
{
connection.Open();
var eCount = connection.ExecuteScalar("SELECT count(*) FROM Book");
count = Convert.ToInt32(eCount);
connection.Close();
}
return count;
}
public Book GetDetail(int id)
{
Book book = new Book();
using (var connection = new OracleConnection(connectOracle))
{
connection.Open();
book = connection.QueryFirstOrDefault<Book>($"SELECT * FROM Book where id={id}");
connection.Close();
}
return book;
}
public IEnumerable<Book> PageListQueryable(int page, int limit)
{
IEnumerable<Book> books = new List<Book>();
string strSql = $"SELECT * FROM(SELECT ROWNUM AS rowno, t.* FROM Employee t WHERE ROWNUM <= {page * limit}) table_alias WHERE table_alias.rowno >= {(page - 1) * limit}";
using (var connection = new OracleConnection(connectOracle))
{
connection.Open();
books = connection.Query<Book>(strSql);
connection.Close();
}
int employees_count = 0;
return books;
}
}
}
第七步:在控制器目录中新建一BookControllers控制器,内容如下
现在还不能拿到数据,因为我们还要在WEB启动项目中增加AUTOFAC的代码,让它能够注入到控制器中。
第八步:修改项目根目录下的Global.asax文件,添加AUTOFAC的注入代码。
namespace BookMvcTest
{
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
var builder = new ContainerBuilder();
builder.RegisterType<BookRepository>().As<IRepository<Book>>();
builder.RegisterType<HomeController>();
builder.RegisterType<BookController>();
IContainer Container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(Container));
}
}
}
第九步:进入BookControllers控制器中,在public ActionResult Index()方法上点右键,添加视图:
第十步:在添加视图的选项中,按下图所示选择: