我目前正在为我们的新应用程序构建数据访问层和业务逻辑层类,我有一个问题(显然)。首先,这里有一些可能会有所帮助的细节:
- 使用 Entity Framework 5 进行模型类和数据访问
- 每个“层”在不同的类库和命名空间(即 App.Model、App.DAL、App.BLL)中分开
从 DAL 开始 - 我决定为所有 DAL 类编写一个基类来继承。
public abstract class DALBase<T> : IDisposable
{
protected AppEntities context;
protected DbSet set;
public DALBase()
{
context = new OECCORPEntities();
set = context.Set(typeof(T));
}
protected virtual void Save()
{
context.SaveChanges();
}
public virtual void Add(T model)
{
set.Add(model);
Save();
}
public virtual T Get(int id)
{
return (T)set.Find(id);
}
public virtual List<T> GetAll()
{
return set.OfType<T>().ToList();
}
public virtual void Delete(int id)
{
T obj = Get(id);
set.Remove(obj);
Save();
}
public virtual void Update()
{
Save();
}
public void Dispose()
{
context.Dispose();
}
}
正如您将看到的,基类实现了一个泛型类型,它应该是 DAL 类负责使用的模型的类型。使用泛型类型,在构造函数中,它使用泛型参数的类型创建一个 DbSet - 它在下面预定义的类似 CRUD 的虚函数中使用(添加、获取等)。
然后我明白了——等一下……因为它是通用的,我真的不必为每个模型都实现 DAL 类。我可以写这样的东西:
public class GenericDAL<T> : DALBase<T>
{
public GenericDAL() : base() {}
}
...我可以用于任何模型。好的,等等到业务逻辑层。我也为 BLL 创建了一个基类:
public abstract class BLLBase<T>
{
protected GenericDAL<T> dal;
public BLLBase()
{
dal = new GenericDAL<T>();
}
public virtual void Add(T model)
{
dal.Add(model);
}
public virtual T Get(int id)
{
return dal.Get(id);
}
public virtual List<T> GetAll()
{
return dal.GetAll();
}
public virtual void Delete(int id)
{
dal.Delete(id);
}
public virtual void Update()
{
dal.Update();
}
}
...它使用 GenericDAL 来完成它的工作。所以以一种类似的方式,我只是写了一个看起来像这样的 GenericBLL 类:
public class GenericBLL<T> : BLLBase<T>
{
public GenericBLL() : base() { }
}
为了测试它,一个简单的控制台应用程序:
class Program
{
static void Main(string[] args)
{
GenericBLL<ADMIN> bll = new GenericBLL<ADMIN>();
List<ADMIN> admins = bll.GetAll();
}
}
...其中“ADMIN”是模型类型。奇迹般有效。
这背后的想法是避免为每个模型编写 DAL / BLL 类,除非它需要额外的功能。有人能告诉我为什么我不想这样做吗?我认为通用 DAL / BLL 类可以完成工作并节省开发时间。
感谢您的时间。