2

我希望标题和以下文字清楚,我对正确的术语不是很熟悉,所以如果我有任何错误,请纠正我。我第一次使用 Linq ORM,想知道如何解决以下问题。

假设我有两个数据库表:

User
----
Id
Name


Phone
-----
Id
UserId
Model

Linq 代码生成器生成一堆实体类。

然后我编写自己的类和接口来包装这些 Linq 类:

class DatabaseUser : IUser
{
    public DatabaseUser(User user)
    {
        _user = user;
    }

    public Guid Id 
    {
        get { return _user.Id; } 
    }

    ... etc
}

到目前为止,一切都很好。

现在很容易找到用户的电话,Phones.Where(p => p.User = user)但 API 的消费者肯定不需要编写自己的 Linq 查询来获取数据,所以我应该将此查询包装在某个函数或属性中。

所以问题是,在这个例子中,你是否会向 IUser 添加一个 Phones 属性?

换句话说,我的界面应该专门为我的数据库对象建模(在这种情况下,电话不属于 IUser),还是它们实际上只是提供一组在概念上与用户相关联的函数和属性(在这种情况下,它做)?

两种观点似乎都有缺点,但我想知道是否有解决问题的标准方法。或者只是您可以分享的任何一般的智慧之词。

我的第一个想法是使用扩展方法,但实际上这在这种情况下不起作用。

4

4 回答 4

2

我有一些糟糕的经历,试图在接口后面抽象 LINQtoSQL 实体。那是不久前的事了,但从记忆中,主要问题是它完全打破了联想。例如,如果你有一个Customer->Order关系,你最终将它暴露为一个sICustomer的集合IOrder,这意味着Customer必须做一些尴尬的映射才能将它的内部Order对象集合转换为IOrders。

然后你必须假设当 aIOrder被传回时,我们可以将它转换为Order. 否则 LINQtoSQL 无法处理它,但这首先破坏了在那里拥有接口的意义。

我强烈建议您不要尝试过多地抽象实体类,LINQtoSQL 实际上并没有在其中添加任何真正的魔法,DataContext 处理它们的持久性生命周期,因此它们仍然是可测试的。

我希望隐藏在接口后面的方面是与 DataContext 的交互,例如使用 Repository 样式的类:

public interface IPhoneRepository 
{
    IEnumerable<Phone> GetPhonesForUser(User user);
}

public class L2SPhoneRepository : IPhoneRepository
{
    private readonly MyDataContext context;

    public L2SPhoneRepository(MyDataContext context)
    {
        this.context = context;
    }

    public IEnumerable<Phone> GetPhonesForUser(User user)
    {
        return context.Phones.Where(p => p.User == user);
    }
}
于 2010-03-19T12:43:31.910 回答
0

您的界面应该模拟您希望如何使用对象。由于您正在尝试抽象,因此消费者不必查询数据库。是否将其设为属性或单独的函数调用(即 GetPhones())完全取决于您。由于您正在完全包装事物,因此您必须对要加载对象的深度/延迟做出一些选择。

于 2010-03-19T12:23:01.010 回答
0

您应该将 Phones 属性添加到 IUser 并使其可为空,因此对于没有 Phone 的用户,它将为空。

由于您不希望 API 的使用者编写查询,因此您应该实现 GetUser().. 等函数。

这是 Asp.net 中 abt n-tier 应用程序的文章列表

http://imar.spaanjaars.com/QuickDocId.aspx?quickdoc=416

于 2010-03-19T12:48:15.180 回答
0

我倾向于将 Linq2Sql 相关的东西视为数据访问代码的实现细节,并且与数据库的真实结构一样,不一定要暴露给系统的其他部分。

如果您的 API 将被其他人使用,那么它应该具有凝聚力且易于使用,并且不会被消费者不需要知道的事情所困扰。如果我正在与用户和他们的手机打交道,我真的不想了解 DataContexts 或(呃)DataSets。

此外,通过保持大部分代码对 L2S 和数据库一无所知,您将更轻松地进行测试、进行模式更改(哦,所以现在 User 表需要保留每次更改的历史记录)甚至完全更改 ORM .

于 2010-03-19T13:02:22.657 回答