阅读本文需要的基础知识:
- 了解Ado.Net基本知识,理解三层架构
- 知道项目中app.config文件的基本知识,像连接字符串配置等。(前面博客有写)
- 简单知道工厂模式和抽象工厂模式内容,对反射有基础了解。
C#(Ado.Net)面向接口的编程解决业务层与数据层紧耦合的基本问题,案例如下
实例一 简单三层:
在简单三层项目中 业务层与数据层是紧耦合的关系。如下图所示为一个简单普通三层结构项目(UI层展现方式可随意,这里是web窗体)
对左边BLL层代码分析可知,如果DAL层发生变化,BLL层会受到影响,这样是BLL层和DAL层构成了紧耦合的关系,不利于稳定性。
实例二 面向接口编程解决紧耦合问题
1.项目结构
2.利用反射创建对象实例的代码解析
using System.Configuration;
using System.Reflection;
namespace DALFactory
{
/// <summary>
/// 抽象工厂:通过反射的形式创建类的实例(对象)。
/// </summary>
public class AbstractFactory
{
private static readonly string DalAssembly = ConfigurationManager.AppSettings["DalAssembly"];//字段已经封装在app.config文件中
private static readonly string Namespace = ConfigurationManager.AppSettings["Namespace"];
public static IDAL.IUserInfoDal CreateUserInfoDal()
{
string fullClassName = Namespace + ".UserInfoDal";
var a = CreateInstance(fullClassName) as IDAL.IUserInfoDal;
return a;
}
/// <summary>
/// 通过反射的形式创建类的实例
/// </summary>
/// <param name="fullClassName"></param>
private static object CreateInstance(string fullClassName)
{
var assembly = Assembly.Load(DalAssembly);//加载程序集
var b = assembly.CreateInstance(fullClassName);
return b;
}
}
}
3.通过分析BLL层代码面向接口编程和抽象工厂模式实现了业务层和数据层完全解耦
using Model;
using System.Collections.Generic;
namespace BLL
{
public class UserInfoService
{
//DAL.UserInfoDal UserInfoDal = new DAL.UserInfoDal();//紧耦合
IDAL.IUserInfoDal UserInfoDal = DALFactory.AbstractFactory.CreateUserInfoDal();
public List<UserInfo> GetList()
{
return UserInfoDal.GetList();
}
}
}
4.以上为一个简单的C#面向接口编程的实例源代码和和数据库文件链接如下: