我首先使用EF代码实现解决方案,使用Repository模式和工作单元来进行正确的分离。我正在疯狂地试图找到正确的方法。
所以我的解决方案如下:
DataAccess项目我在那里编写我的代码的第一个类(Currenty我只有一个:Posts.cs)并写了我的DBContext,y还在这里添加了我需要的其他类例如登录,我将它们标记为[NotMapped ](我知道......这没有意义)
存储库:我在哪里实现了存储库模式和工作单元
WCF服务项目:我在这里访问工作单元,如:
var posts= unitOfWork.PostRepository.Get()
这里一切都很好,但我可能需要这样做:
unitOfWork.PostRepository.Insert(Post)
现在解耦dataAccess的所有目的都转到了shi **,因为我需要引用DataAccess项目。
所以,有几个问题:
请帮助!!!
答案 0 :(得分:0)
你在这里描述的问题花了很长时间才引起我的注意。您肯定在正确的轨道上想要分离数据访问和业务逻辑,业务逻辑应该在自己的项目中,因此您需要做的是以存储库接口的形式创建抽象。类似的东西:
interface IPostRepository
{
void Insert(Post post);
void Update(Post post);
void Delete(int postId);
Post GetById(int postId);
}
此接口必须放在业务逻辑项目中,因为您的业务逻辑需要能够读取和写入数据。
在您的数据访问中,您实现了此接口,因此您需要从数据访问层到业务逻辑的引用,而不是相反。
最后,您需要将接口和实现联系在一起,这应该在WCF服务项目中完成,这意味着它既可以引用数据层,也可以引用业务层。使用此设置,您可以使用类似于下面的WCF服务方法。
void InsertPost(Post post)
{
using (var db = new DbContext())
{
var postRepository = new PostRepository(db);
var postService = new PostService(postRepository);
postService.Insert(post);
db.SaveChanges();
}
}
现在看起来有点奇怪,因为PostService似乎必须知道PostRepository。但PostService的构造函数如下所示:
public PostService(IPostRepository postRepository)
{
_postRepository = postRepository;
}
上面示例中的PostRepository和PostService的手动构建远非理想。 我真的建议你看一下Inversion of Control容器大多数这种脱钩和分层变得轻而易举。有几个:Autofac,Unity,Ninject等。