随着软件开发的不断进步,数据库操作的标准化和封装变得越来越重要。本文将介绍如何通过定义接口和实现类来实现数据库操作的标准化和封装,并通过依赖注入来解耦业务逻辑层和数据库操作方式。
ASP.NET MVC框架基于泛型和依赖注入。在WebForm时代,通常从数据库设计开始初始化项目。而在使用MVC时,以模型为导向进行编码。因此,在CSHTML文件和DAL cs文件中,需要知道想要获取或发送的表或模型数据。泛型是一个很好的方式,依赖注入是帮助定位实现类的更好系统方式。
如果想使用配置文件来确定想要使用的数据库操作风格,可以将代码添加到配置或json文件中。如果想使用系统依赖注入,可以忽略这段代码。
public class Startup
{
public static string DBOStyle = Configuration["DBOperation:Stylename"];
public static string apppath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
public static string appname = Assembly.GetExecutingAssembly().GetName().Name;
}
系统依赖注入方式——创建依赖注入容器:
container = new UnityContainer();
container.RegisterType(typeof(IBaseDAL<>), typeof(EntityFrameworkDAL<>));
定义一个用于识别数据库操作风格的类:
public class SetDBOStyle<T> where T : class
{
private static readonly string DBOStylename = Startup.DBOStyle;
private SetDBOStyle() { }
public static object CreateDAL()
{
try
{
string a = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Namespace;
string b = a + '.' + DBOStylename + "`1[" + typeof(T).ToString() + "]";
Type DBOStyleClass = Type.GetType(b);
object pp = Activator.CreateInstance(DBOStyleClass);
return pp;
}
catch (Exception ex)
{
throw new Exception(ex.Message.ToString());
}
}
}
定义一个基础数据库访问接口:
public interface IBaseDAL<T> where T : class
{
IList<basemodel> ReturnATableData();
}
定义Entity Framework数据库访问实现类:
public class EntityFrameworkDAL<T> : IBaseDAL<T> where T : class
{
public IList<basemodel> ReturnATableData()
{
try
{
var dbContext = new MyContext();
IDatabaseInitializer<MyContext> dbInitializer = null;
if (dbContext.Database.Exists())
{
dbInitializer = new DropCreateDatabaseIfModelChanges<MyContext>();
}
else
{
dbInitializer = new DropCreateDatabaseAlways<MyContext>();
}
Database.SetInitializer(dbInitializer);
List<T> resultlist = new List<T>();
Type Tablemodelclass = System.Type.GetType(typeof(T).ToString(), true);
DbSet aa = dbContext.Set(Tablemodelclass);
foreach (var item in aa)
{
resultlist.Add((T)item);
}
dbContext.Dispose();
List<basemodel> pp = new List<basemodel>();
BaseLibrary<basemodel, T>.DALmodeltoVIEWmodel(ref pp, resultlist);
return (pp);
}
catch (Exception ex)
{
throw new Exception(ex.Message.ToString());
}
}
}
定义ADO.NET数据库访问实现类:
public class ADONETDAL<T> : IBaseDAL<T> where T : class
{
// 重复上述函数定义,使用ADO.NET技术
}
定义NHibernate数据库访问实现类:
public class NHIBERNATEDAL<T> : IBaseDAL<T> where T : class
{
// 重复上述函数定义,使用NHibernate技术
}
public IActionResult Index()
{
// 调用方法一
// Idboperation = (IBaseDAL<people>)SetDBOStyle<people>.CreateDAL();
// 调用方法二
Idboperation = Startup.container.Resolve<IBaseDAL<people>>();
if (Idboperation != null)
{
IList<basemodel> temp = Idboperation.ReturnATableData();
List<people> PP = new List<people>();
BaseLibrary<people, basemodel>.DALmodeltoVIEWmodel(ref PP, temp);
return View(PP);
}
return View();
}