gpt4 book ai didi

c# - 具有 Entity Framework 的 WCF 存储库服务模式

转载 作者:行者123 更新时间:2023-11-30 16:33:20 30 4
gpt4 key购买 nike

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

我现在做的事

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

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

我的仓库库

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 一起使用,

最佳答案

Is that service / respository container fine ?

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

然后您将拥有:ServiceContainer SurveyService = new ServiceContainer(..);

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

这会破坏 SRP , Common Closure Principle可能是Common Reuse Principle .

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

I already have the service layer, so as i have wcf service what i call the current service layer servicewrapper or something ?

So i need to change name of my service (BL) layer to something service wrapper or something , then in wcf service layer i define methods in repository and service then just calls curresponding methods in service, repository

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

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

关于命名 - 到白板上把所有东西都画出来,然后根据需要重命名所有东西。至少通过一个连贯的概述,您将能够清楚地理解所有内容。

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

这些文章可能会有帮助:

I need to call repository methods itself eg: GetCategory() etc , also all methods in service layer, So i need to wrap both methods and service in wcf service, is it fine ?

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

Where to do the caching ? as i am using EF i think there is something way to use a cache provider with EF

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

在您的 RepositoryContainer 中,_SurveyRepository 字段是公共(public)的 - 它不应该是私有(private)的吗?否则为什么要有只读(获取)SurveyService 属性?

public SurveyRepository _SurveyRepository;

关于c# - 具有 Entity Framework 的 WCF 存储库服务模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3312071/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com