2010-03-19 64 views
2

我希望标题和下面的文字清晰,我对正确的术语不太熟悉,所以如果我弄错了任何错误,请纠正我。我第一次使用Linq ORM,并想知道如何解决以下问题。关于Linq to SQL映射对象设计的建议

说我有两个DB表:

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查询来获取数据,所以我应该将此查询包装在某个函数或属性中。

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

换句话说,我的接口是否应该专门模拟我的数据库对象(在这种情况下,电话不属于IUser),还是它们实际上只是提供一组功能和属性,这些功能和属性在概念上与用户在这种情况下它)?

这两个视图似乎都有缺陷,但我想知道是否有标准的解决方法。或者只是你可以分享的任何一般智慧词汇。

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

回答

2

我有一些糟糕的经历试图在接口后面抽象LINQtoSQL实体。这是前一段时间,但从记忆来看,主要问题是它完全打破了联想。举例来说,如果你有一个Customer - >Order关系,你最终会露出它作为一个ICustomer,与IOrder秒的收集,这意味着Customer必须做一些尴尬映射投它Order对象的内部集合作为IOrder小号。

然后你必须假设当一个IOrder得到通过,我们可以把它投到Order。否则LINQtoSQL无法处理它,但是这首先破坏了界面。

我强烈建议你不要试图抽象掉实体类,LINQtoSQL实际上并没有在其中放入任何真正的魔法,DataContext处理它们的持久生命周期,所以它们仍然是可测试的。

,我要寻找的界面背后隐藏会使用存储库样式类与DataContext的相互作用,例如方面:

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); 
    } 
} 
0

您的界面应该模拟如何使用对象。既然你试图抽象,那么消费者就不必查询数据库。无论您是将其设置为属性还是单独的函数调用(即GetPhones()),都完全取决于您。既然你完全包装了东西,你必须对你想要加载对象的深度/延迟性做出一些选择。

0

你应该电话属性添加到IUSER并使其可为空,因此对于没有电话的用户,它将为空。

既然你不希望API的消费者编写查询,应该比你实现类似功能的getUser()..等

下面是在ASP文章ABT n层应用的一个很好的列表。净

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

0

我倾向于考虑LINQ2SQL相关的东西是数据访问代码的实现细节,像数据库的真实结构,不一定要暴露于系统的其他部分。

如果你的API将被其他人使用,它应该是内聚的,易于使用,并且不会被消费者不需要知道的东西混淆。如果我正在处理用户和他们的手机,我并不想知道DataContexts或(呃)DataSets。另外,通过保持大部分代码不知道L2S和数据库,您将可以更轻松地进行测试,进行模式更改(哦,现在用户表需要记录所做的每个更改的历史记录),甚至更改彻底改变ORM。