gpt4 book ai didi

wcf - DbContext、EF 和 LINQ - 通过接口(interface)在 DbContext 上公开方法的最佳方式是什么?

转载 作者:行者123 更新时间:2023-12-02 02:17:30 29 4
gpt4 key购买 nike

我是 EF 和 DBContext 的新手,因此我正在寻找一些建议,以了解使用 EF、存储过程或 SQL 为 WCF 服务设置代码的最佳方式。

背景

我有一个 MVC3 前端,它连接到 WCF 服务层以进行数据访问 (Oracle)。实际的数据访问是通过一个单独的 DAO 类库进行的。

我的目标是让服务层只使用一个接口(interface),它可以在该接口(interface)上调用一组方法来返回数据。我不希望服务层知道我们正在使用 EF 进行查询,因为我可能会在需要时将慢速 EF 位替换为存储过程或纯 SQL 文本。

我现在在做什么

我有一个用于我的数据库 IDB 的接口(interface),以及一个 IDB 的具体实现,MyDB,它也实现了 DBContext。 MyDb 然后有几个派生类,称为 MyStdDB 和 MySecureDB。当我需要接口(interface)时,我会调用我的工厂方法,该方法计算出我需要标准数据库还是安全数据库,然后将其返回到我的接口(interface)变量中。

WCF代码:

public List<string> GetAccount() {
IDB _db = DBFactory.GetInstance();
return _db.GetAccount();
}

DBFactory代码:

 pubilc class DBFactory {
pubilc static IDB GetInstance()
{
if bSecure
return MySecureDB;
else
return MyStdDB;
}
}

因此,当我想查询时,我想在我的服务调用中询问 _db.GetAccount()。目前,我已将其添加为 IDB 接口(interface)上的扩展方法。这样做的原因是为了防止服务看到我的 EF 实体,并且它允许将 qqueries 分离到逻辑文件中,例如。包含 CUSTOMER 查询的类,包含 ACCOUNT 查询的类。

IDB 代码:

public interface IDB : IDisposable
{
ObjectContext UnderlyingContext { get; }
int SaveChanges();
}

MyDB代码:

public class MyDB : DbContext, IDB 
{
ObjectContext IDB.UnderlyingContext
{
get
{
return ((IObjectContextAdapter)this).ObjectContext;
}
}

int IDB.SaveChanges()
{
return SaveChanges();
}

public DbSet<Customer> Customer { get; set; }
}

扩展方法:

public static List<string> GetAccount(this IDB _db)
{
((MyDB)_db).Customer.AsNoTracking().First();
}

问题

如您所见,我必须将接口(interface)转换为具体对象,以便我可以访问 EF 实体。这是因为实体是在类的实现上而不是在接口(interface)上。 Extension 方法在我的 DAO 类库中,所以当我的 IDB implmentation 改变时它会改变,但我仍然不喜欢它。有更好的方法吗?我在看 DI 吗?

对我来说最大的驱动因素是:

  • 必须仅通过接口(interface)访问数据库,因为我们可能很快就会更换数据库。
  • 数据访问方法必须对服务隐藏。我应该只能通过接口(interface)/扩展方法等提供的方法访问数据。

最佳答案

解决方法是将您的 GetAccount 移动到 IDB 而不是使用扩展方法:

public interface IDB : IDisposable
{
ObjectContext UnderlyingContext { get; }
List<string> GetAccount();
int SaveChanges();
}

它解决了您的问题,因为 MyDB 将实现该方法,并且所有派生类也将使用实现。如果他们提供其他实现,他们将简单地覆盖它。

The data access methods must be hidden from the service. I should only be able to access data via the methods provided by the interface/extension methods etc.

但他们不是。如果方法/属性不是公开的,则该方法/属性是隐藏的,但目前您的任何服务都可以将 IDB 转换为 MyDB 并直接访问 DbSet

关于wcf - DbContext、EF 和 LINQ - 通过接口(interface)在 DbContext 上公开方法的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9775318/

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