这是我考虑过的一个主题,并试图让POC工作,但说实话我有点失落。
所以我有一个3层的网络应用程序,传统的DAL,BAL& FE结构用于本练习。
DAL通过实体框架引用了我的数据库,从中我们可以访问单个表JobInfo。
BAL引用DAL项目并具有以下界面:
public interface IJobInfoRepository
{
IEnumerable<JobInfo> SelectAll();
JobInfo SelectByID(string id);
void Insert(JobInfo obj);
void Update(JobInfo obj);
void Delete(string id);
void Save();
}
然后我有这个班:
public class JobInfoRepository : IJobInfoRepository
{
public JobInfoRepository()
{
_db = new TestEntities();
}
public JobInfoRepository(TestEntities db)
{
_db = db;
}
private TestEntities _db = null;
public IEnumerable<JobInfo> SelectAll()
{
return _db.JobInfoes.ToList();
}
public JobInfo SelectByID(string id)
{
return _db.JobInfoes.Find(id);
}
public void Insert(JobInfo obj)
{
_db.JobInfoes.Add(obj);
}
public void Update(JobInfo obj)
{
_db.Entry(obj).State = EntityState.Modified;
}
public void Delete(string id)
{
JobInfo existing = _db.JobInfoes.Find(id);
_db.JobInfoes.Remove(existing);
}
public void Save()
{
_db.SaveChanges();
}
}
在我的FE项目中,我引用了BAL项目。但这就是我迷失的地方。如果没有FE访问DAL项目并因此可以看到我的JobInfo实体,那么FE代码如何执行BAL项目中的任何CRUD操作?
谢谢,
戴夫
答案 0 :(得分:1)
您可以使用两种不同的方法。
AutoMapper
或ValueInjecter
2的优点是你真正从你的持久层(DAL)使用的实体中去除了BL和FE中使用的模型。您还可以在BL的模型和您将在FE中显示或编辑的模型之间应用此分析(例如,在MVC中实现视图模型)。
如果你正在实施一个简单的项目,也许你会满意1.但如果你实现的东西有点复杂,建议使用2。
顺便说一句,如果你实现一个基础通用存储库(即Repository<T>
)并为每个实体继承它,而不是为每个实体实现一个存储库,那么你将节省大量时间,而只实现extar基本存储库中没有的功能。
使用EF可以很容易地实现通用存储库,因为您可以使用DbSet<T>
集合。