EFDAL層
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Dulei.IDAL;
using Dulei.Model;
namespace Dulei.DAL
{
public class UserInfoEFDal:IUserInfoDal 繼承IUserInfoDal接口
{
public UserInfo ADD(UserInfo userInfo) 使用IUserInfoDal實現接口
{
DataModelContainer db = new DataModelContainer();
db.UserInfo.Add(userInfo);
db.SaveChanges();
return userInfo;
}
}
}
AdoNetDal層
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Dulei.IDAL;
namespace Dulei.AdoNetDAL
{
public class UserInfoAdoNetDal:IUserInfoDal 繼承IUserInfoDal接口
{
public Model.UserInfo ADD(Model.UserInfo userInfo) 使用IUserInfoDal實現接口
{
throw new NotImplementedException();
}
}
}
1、建立接口層IDAL
2、IDal層創建了UserInfo實例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Dulei.Model;
namespace Dulei.IDAL
{
public interface IUserInfoDal
{
UserInfo ADD(UserInfo userInfo);
}
}
BLL層調用接口實例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Dulei.AdoNetDAL;
using Dulei.DAL;
using Dulei.IDAL;
using Dulei.Model;
namespace Dulei.BLL
{
public class UserInfoService
{
IDAL.IUserInfoDal userInfoDal =new UserInfoEFDal(); IDAL.IUserInfoDal實例。只需要改new UserInfoEFDal();new IUserInfoDal();就可以更換數據DAL層
public UserInfo AddUserInfo(UserInfo userInfo)
{
return userInfoDal.ADD(userInfo);
}
}
}
總結:更換數據層時就可以不用在去更改業務層代碼了。只需要更改new的實例。
如果要改數據庫還需要改new實例
二、new實例
上面已經對實例進行了接口的改良。下面對NEW 實例就行改良。
DalFactory類庫增加類名爲DALFactory
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Dulei.DAL;
namespace Dulei.DalFactory
{
public class DALFactory
{
public static IDAL.IUserInfoDal GetUserInfoDal()
{
return new UserInfoEFDal();
}
}
更改BLL層NEW的實例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Dulei.AdoNetDAL;
using Dulei.DAL;
using Dulei.IDAL;
using Dulei.Model;
namespace Dulei.BLL
{
public class UserInfoService
{
private IDAL.IUserInfoDal userInfoDal = DalFactory.GetUserInfoDal(); 通過DalFactory.GetUserInfoDal();拿到NEW的新實例
public UserInfo AddUserInfo(UserInfo userInfo)
{
return userInfoDal.ADD(userInfo); 以後更換DAL時只需要改return後面的代碼,更換ado的數據庫UserInfoAdoNetDal
}
}
}
雖然看上去簡單,但是這裏體現了面向對向的恩想。
新的問題要更數據庫還要更改UserInfoDAL
傳程序集進來。
namespace CZBK.OADemo.DalFactory
{
public class DALSimpleFactory
{
public static IDAL.IUserInfoDal GetUserInfoDal()
{
//如果直接new 的話那麼必須 改代碼的才能切換不同的數據庫訪問層。
//非常希望能做到:只改配置就能夠創建出實例出來。也就是改變數據庫訪問層的實現。
//return GetInstences("CZBK.OADemo.DAL", "CZBK.OADemo.DAL." + "UserInfoDal") as IUserInfoDal;
return new UserInfoAdoNetDal();
}
public static Object GetInstences(string assemblyName, string typeName)
{
return Assembly.Load(assemblyName).CreateInstance(typeName);
//return null;
}
}
}
同過程序集來判斷程序集的類型名字。
在去webconfig下
<appSettings>
<add key="webpages:Version" value="2.0.0.0" />
<add key="webpages:Enabled" value="false" />
<add key="PreserveLoginUrl" value="true" />
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
<add key="AssemblyName" value="Dulei.Dal" />
<add key="NameSpace" value="Dulei.Dal" />
</appSettings>
增加了
<add key="AssemblyName" value="Dulei.Dal" />
<add key="NameSpace" value="Dulei.Dal" />
通過更改appsettings來修改使用的數據庫