gpt4 book ai didi

c# - 使用存储库模式实现 WCF 数据服务

转载 作者:行者123 更新时间:2023-11-30 15:43:21 25 4
gpt4 key购买 nike

我们在 ASP.NET MVC 3 应用程序中使用存储库模式。这意味着,尽管我们使用 EF 4.1 Code First 访问后端中的数据,但所有 MVC Controller 都通过通用存储库类而不是直接通过 DbContext 子类来执行此操作。

简化的代码片段:

public class MyEntityContext : DbContext, IMyEntityContext
{
public IDbSet MyEntities { get; set; }
...
}

public class MyEntityRepository : IMyEntityRepository
{
private IMyEntityContext _context;

public IQueryable<MyEntity> MyEntities
{
return _context.MyEntities;
}
...
}

public class MyEntityController : Controller
{
private MyEntityRepository _repository;
...
}

我们为每个依赖项使用接口(interface)和依赖项注入(inject)。它工作正常。看起来不错,不是吗?但现在要注意:

我们还提供 WCF 数据服务(支持 Code First 的 CTP)来访问实体。我们也想在该服务中使用存储库。但这似乎很棘手。使用 MyEntityContext 时直接,服务看起来像这样:

public class MyEntityService : DataService<MyEntityContext>
{
public static void InitializeService(DataServiceConfiguration config)
{
config.SetEntitySetAccessRule("MyEntities", EntitySetRights.All);
}
}

但是当我尝试替换 MyEntityContext通过存储库,有两个问题:

  1. 为泛型指定的类型 DataService<..>需要是一个具有默认构造函数的类,这打破了漂亮的按契约(Contract)设计和依赖注入(inject)设计。
  2. 似乎提供的类型必须是 DbContext类:我尝试并使用了 MyEntityRepository相反,但失败了(查看详细信息)。

我好像迷路了...谁能把我带回正轨?


详细信息:

我的第一步是:

public class MyEntityService : DataService<MyEntityRepository>
{
...

但是,调用该服务时失败并显示以下错误消息:

The server encountered an error processing the request. The exception message is 'On data context type 'MyEntityRepository', there is a top IQueryable property 'MyEntities' whose element type is not an entity type. Make sure that the IQueryable property is of entity type or specify the IgnoreProperties attribute on the data context type to ignore this property.'.

我尝试了以下步骤来解决这个问题,但没有摆脱这个错误消息:

  • 添加 [DataServiceKey("MyEntityId")]到 MyEntity,其中 MyEntityId 是实体的正确关键属性。
  • 替换 Repository.MyEntities 的类型通过 IDbSet而不是 IQueryable .

顺便说一句:以下帖子是重复的:

最佳答案

为什么要使用存储库?你有上下文,所以使用它。不要仅仅因为你想使用模式就创建洋葱架构。 WCF 数据服务本身已经可以处理您需要的一切。不用抱歉,它有时会提供更多(例如拦截器)。

通过使用自定义存储库,您将移动到 reflection provider data source .如果您还计划通过 WCF 数据服务修改您的实体,这也是针对您的存储库的,因为反射提供程序是只读的,除非它也实现了 IUpdateable。也检查 rules for reflection provider .

顺便说一句。 .NET 4 中的 WCF 数据服务不直接支持 DbContext(该支持仅在即将推出的版本的 CTP 中),但你有 workaround for that .该链接适用于旧的 CTP。在当前版本中没有 UnderlyingContext 属性,但您可以使用 IObjectContextAdapter 来获取 ObjectContext

正如您在提供给服务的最后一个链接类型中也看到的那样,不需要有默认构造函数——这取决于您在创建数据源时使用什么构造函数。如果您需要依赖项注入(inject),您可能必须检查如何直接注入(inject)到服务本身(例如 here 对于 Unity 和纯 WCF)并在 CreateDataSource 中使用注入(inject)的数据。

关于c# - 使用存储库模式实现 WCF 数据服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6748199/

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