EF代码首先使用Repository和工作单元

时间:2014-11-15 12:07:41

标签: entity-framework wcf model repository unit-of-work

我首先使用EF代码实现解决方案,使用Repository模式和工作单元来进行正确的分离。我正在疯狂地试图找到正确的方法。

所以我的解决方案如下:

  1. DataAccess项目我在那里编写我的代码的第一个类(Currenty我只有一个:Posts.cs)并写了我的DBContext,y还在这里添加了我需要的其他类例如登录,我将它们标记为[NotMapped ](我知道......这没有意义)

  2. 存储库:我在哪里实现了存储库模式和工作单元

  3. WCF服务项目:我在这里访问工作单元,如:

    var posts= unitOfWork.PostRepository.Get()
    
  4. 这里一切都很好,但我可能需要这样做:

    unitOfWork.PostRepository.Insert(Post)    
    

    现在解耦dataAccess的所有目的都转到了shi **,因为我需要引用DataAccess项目。

    所以,有几个问题:

    1. 哪种方法最好,我怎样才能将模型分开?
    2. 我没有业务层,所有逻辑如登录到活动目录,可以将它放在WCF项目中吗?
    3. 请帮助!!!

1 个答案:

答案 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等。