【问题标题】:WCF Repository Service pattern with entity framework带有实体框架的 WCF 存储库服务模式
【发布时间】:2011-03-19 17:32:50
【问题描述】:

我需要 Silverlight、asp.net 等中的表示层,所以一切都通过 wcf 服务。 我对存储库层、服务层、wcf 服务的实现有很多疑问

我现在做的事情

  1. 我有存储库,它不是按表创建的,而是按聚合根创建的
  2. 我有服务层用于执行涉及多个存储库的一组操作
  3. WCF 服务将方法封装在服务层和存储库层
  4. 实体由 EF 自动生成
  5. 实体作为完整图传递并返回到服务层

6.我有两个包含所有存储库的具体类,以及称为存储库容器和服务容器的服务,存储库容器被传递给服务

我的存储库基础

public class RepositoryBase
    {
        public DataBaseContext _Context;
        public RepositoryContainer _RepositoryContainer;
        public RepositoryBase(RepositoryContainer repositoryContainer)
        {
            _RepositoryContainer = repositoryContainer;
            _Context = repositoryContainer.Context;
        }
        public RepositoryBase()
        {
            _RepositoryContainer = new RepositoryContainer();
            _Context = _RepositoryContainer.Context;
        }


    }

我的仓库容器

public class RepositoryContainer
    {
        public RepositoryContainer()
        {
            Context = new DataBaseContext();
        }
        public RepositoryContainer(DataBaseContext context)
        {
            Context = context;
        }
 public DataBaseContext Context
    {
        get;
        set;
    }


        public SurveyRepository _SurveyRepository;
        public SurveyRepository SurveyRepository
        {
            get
            {
                return _SurveyRepository ?? (_SurveyRepository = new SurveyRepository(this));
            }           
        }


}

我的服务容器

 public class ServiceContainer
    {
        public ServiceContainer()
        {
            RepositoryContainer = new RepositoryContainer();
        }
        public ServiceContainer(RepositoryContainer container)
        {
            RepositoryContainer = container;
        }


        public RepositoryContainer RepositoryContainer
        {
            get;
            set;
        }
   public SurveyService _SurveyService;
        public SurveyService SurveyService 
        {
            get
            {
                return _SurveyService?? (_SurveyService= new SurveyService(this));
            }           
        }


    }

做一个操作 我只是创建 RepositoryContainer 或 ServiceContainer

然后调用

RepositoryContainer.Repository.Method()
ServiceContainer.Service.Method()

我的疑惑是

  1. 那个服务/存储库容器好吗?

  2. 我已经有了服务层,所以我有 wcf 服务,我称之为当前服务层 servicewrapper 什么的?

  3. 我需要自己调用存储库方法,例如:GetCategory() 等,还有服务层中的所有方法,所以我需要将方法和服务都包装在 wcf 服务中,可以吗?

    李>
  4. 在哪里进行缓存?当我使用 EF 时,我认为有办法将缓存提供程序与 EF 一起使用,

【问题讨论】:

  • - 客户端可以直接访问单个 WCF 方法,或者通过服务层(将一个或多个 WCF 方法“聚合”成一个更大/更复杂的“方法” - 对吗? - 缓存:做你有性能问题吗?如果是 - 在哪里? - ServiceContainer 和 RepositoryContainer 有什么区别?
  • 存储库确实像 GetCategories、插入删除等,操作 / BL 在服务中完成,例如:我有用户存储库、调查存储库,当我更新调查时,我更新用户中的一个字段(逻辑) ,所以它在surveyservice中处理,它调用用户和调查存储库方法,只是我的存储库不包含逻辑,所有逻辑都包装到服务层中,而不是创建每个存储库实例,而是全部包装到存储库容器中,所以我只是需要创建存储库容器(创建它的实例并不昂贵),
  • 服务同理,在创建服务容器时传递repository容器,然后传递给每个服务实例,所以在每个服务中不需要创建每个repository实例,注意:我不是国际奥委会的粉丝。问题是,我喜欢当前不使用 WCF 所做的事情,这意味着所有内容都驻留在单个服务器中,我需要单独的应用服务器 (BL),如果它们全部放在一起,我只是引用核心 dll,创建存储库容器实例,服务容器调用方法,现在我需要 WCF
  • 我需要通过 WCF 调用存储库和服务,所以我需要将我的服务(BL)层的名称更改为服务包装器或其他东西,然后在 wcf 服务层中定义存储库和服务中的方法然后只是在服务、存储库中调用相应的方法,我对我所做的事情感到困惑,

标签: c# wcf entity-framework architecture


【解决方案1】:

那是服务/存储库吗 容器好吗?

RepositoryContainer 类包含一个“SurveyRepository”——但 SurveyRepository 不应该是 RepositoryContainer 的一个实例吗? ServiceContainer 和“SurveyService”也是如此。如果他们是的话,对我来说会更有意义(尽管如果不更熟悉该项目,很难准确评论)。

你会得到:ServiceContainer SurveyService = new ServiceContainer(..);

如您所见,我的印象是“SurveyService”是一个特定的业务概念,但它包含在一个更通用的类型(ServiceContainer)中; SurveyRepository / RepositoryContainer 相同。

这将破坏SRPCommon Closure Principle 和可能的Common Reuse Principle

我不确定其他人是怎么想的,但我也不喜欢以实例的类型命名实例(除了最基本的 senarios - 这不是):public SurveyRepository SurveyRepository 类型的名称应该反映类型是什么(或做什么),这将与它的特定实例(如 ServerContainer 和 ServeyService)不同。

我已经有了服务层,所以 因为我有 wcf 服务,我称之为 当前服务层 servicewrapper 还是什么?

所以我需要更改我的服务名称 (BL) 层到某事服务 包装器或其他东西,然后在 wcf 服务层我定义了方法 存储库和服务然后只是调用 相应的服务方法, 存储库

一般来说,任何可重用的 BL 都应该在一个独立的包中,而不是包含在(认为是“硬编码”)服务层或 WCF 服务等中。然后,您将创建位于 BL 顶部的服务端点.如果您的业务事务跨越不同包中的不同业务对象,那么您需要将更高级别的编排放在更高的位置 - 我想这可以放在服务层,但这不是琐碎的事情要做,你需要仔细考虑某些责任在哪里。

如果事务涉及同一个包中的不同业务对象,那么编排会简单得多,并且可以使用另一种设计用于处理该工作的 BL 类型来完成,这将是该包的一部分 - 并且不在服务层。

关于命名 - 转到白板并将所有内容映射出来,然后根据需要重命名所有内容。至少通过一个连贯的概述,您将能够清楚地了解所有内容。

BL 包的名称应与它们的用途相称 - 在业务术语中。包装这些的 WCF 服务应该有一个合适的名称,这可能包括对正在使用的通道类型(JSON、WebService 等)的引用。因为您可以通过配置更改 WCF 服务使用的通道(如果服务设计正确),这可能不是一个好主意 - 但假设它没有,那么额外的清晰度可能会有所帮助。

这些文章可能会有所帮助:

我需要调用存储库方法 本身例如:GetCategory() 等,也 服务层中的所有方法,所以我 需要包装方法和服务 在wcf服务中,可以吗?

将服务包装在服务中听起来有点可疑。只有外部调用者应该通过服务 - 假设服务旨在将 BL 暴露给外部方。内部调用者应该知道哪个是合适的调用方法(由于是内部的),大概它与服务公开的方法相同。

在哪里进行缓存?如我一般 使用 EF 我认为有一些东西 通过 EF 使用缓存提供程序的方法

我不知道您是否可以在 EF4 中缓存,但如果可以的话,我不会感到惊讶。在哪里做缓存? - 这取决于您要消除的瓶颈在哪里。

在您的 RepositoryContainer 中,_SurveyRepository 字段是公开的 - 不应该是私有的吗?否则为什么要有一个只读 (get) SurveyService 属性?

public SurveyRepository _SurveyRepository;

【讨论】:

  • 它的私有 .. 我在 sf 中重新输入了一些代码,它是错误的:)
  • 感谢您的描述性回答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-11
  • 1970-01-01
相关资源
最近更新 更多