C# 用IDal包装实体框架<;T>;界面
我想用C# 用IDal包装实体框架<;T>;界面,c#,.net,entity-framework,architecture,C#,.net,Entity Framework,Architecture,我想用IDal接口包装我的EntityFrameWork类,只使用CRUD操作 我想创建对应于每个实体的BL数据模型 意思是如果我有TempEntity我将创建TempBlObj和接口IDal 完成这项任务有什么指导意义吗 我在实现Save(TempBlObj) 由于实体中的保存由以下人员完成: mdbenties.SaveChanges() 这取决于对实体引用所做的更改 有什么解决办法吗 更新 我这么做是为了模仿我的IDal界面 例如,为了更改TempEntity.status 我必须创建一个
IDal
接口包装我的EntityFrameWork
类,只使用CRUD操作
我想创建对应于每个实体的BL数据模型
意思是如果我有TempEntity
我将创建TempBlObj
和接口IDal
完成这项任务有什么指导意义吗
我在实现Save(TempBlObj)
由于实体中的保存由以下人员完成:
mdbenties.SaveChanges()代码>
这取决于对实体引用所做的更改
有什么解决办法吗
更新
我这么做是为了模仿我的IDal
界面
例如,为了更改TempEntity.status
我必须创建一个具体的方法ChangeStatus()
,而不是通用的CRUD
:Save(BlObj项)
与实体一起保存的操作如下
。引用某个实体,进行一些更改。
和
mmamdbenties.SaveChanges()代码>
我试图添加BlObjects,以放松Bl和具体实体fw之间的依赖关系
更一般:
在使用ORM时,使用IDal
intreface(CRUD
操作)的最佳实践是什么?保存实体的责任不应是实体本身的工作。这是个坏主意。
你可以考虑在你的情况下实现。 在为我的系统设计一个存储库时,我想记住的几个事实是:
- O/RM有助于我实现存储实体。这意味着我没有专门划分业务实体和数据库实体。我有一个
用户
实体,ORM应该保持它,不管怎样,我不打算在这里介绍额外的层
- 我从限制较少的界面开始:
界面线{
T获取(id);
void Save(对象o);//或T,如果需要
IQueryable查询();
}
- 而且-可以很好地模拟(使用最小起订量的样本)
var users=new List(){/*此处的用户*/}
var mockedRepository=new Mock();
//打扮
mockedRepository.Setup(
self=>self.Get(It.IsAny())
.Returns((int id)=>_users.First(u=>u.id==id));
我认为您将与框架作斗争!我认为您必须明确地分离所有其他实体才能实现这一点。您真的需要它以这种方式工作吗?它是用于单元测试的。否则您会怎么做?我很难准确地想象您正试图做什么,更多的上下文可能会有所帮助。虽然我可以看到其中的优点考虑到DAL(即EntityFramework),这将用于隔离单元测试的代码是一个相当已知的数量,在您的测试设置中,让单元测试运行在真实的DAL上,并创建测试DB实例等不是更实用吗?您将如何模拟EntityFW?它是用于单元测试的。否则您将如何做?我在实现Save(TempBlObj)时遇到问题因为实体中的保存是由:mdbenties.SaveChanges()完成的,而这依赖于对实体引用所做的更改。“保存实体的责任不应该是实体本身的工作。”-可以。这种模式是“ActiveRecord”或“Row Gateway”但对于EF,T是一个具体的DBEntity项。否?那么context.SaveChanges()将如何工作?它依赖于EF DTO上的更改检测,否?
interface IDal {
T Get<T>(id);
void Save(object o); //or T, if needed
IQueryable<T> Query<T>();
}
var users = new List<User>(){ /* Users here */}
var mockedRepository = new Mock<IRepository>();
//getup GET
mockedRepository.Setup(
self => self.Get<User>( It.IsAny<int>() )
.Returns( (int id) => _users.First(u => u.Id == id) );