我正在创建我的第一个更大的ASP.NET MVC应用程序。在考虑了应用程序架构一段时间后,我想我会听到其他一些意见。
我正在为我的数据层使用LINQ-SQL。但是,我不打算在整个应用程序中使用LINQ对象,因为我想为某些字段提供一些更具体的数据类型(例如,我希望Url字段是System.Uri类型,而不是System.String)。由于DataContext可能并不总是可用,因此看起来围绕LINQ对象并不是一个好主意。我绝对会对此发表一些意见。
我创建了一些更具体的对象来表示我的数据。可以将LINQ对象解析为这些对象,并创建了一些DataClient类,这些类利用LINQ DataContext检索数据,然后将数据解析为自定义对象并返回。这允许仅使用LINQ-SQL作为数据层。
现在想到一个复杂因素。如何更新数据库中的对象值。我仍在争论是否使用我的自定义对象(因此需要相关属性具有setter)作为更新方法的参数。如果我采用这种方法,我计划将Id:int属性设置为可空类型,并且只能在将LINQ数据对象解析为自定义对象时设置Id属性。我认为这是有道理的,因为数据库是实际分配标识符的唯一地方。
这种方法不会让我在没有先从数据库中检索记录的情况下更新记录,即使我知道Id。另一方面,我可以制作将每个字段作为参数的更新方法。但是,这似乎是很多双重代码。
现在为MVC模型。我不确定是在视图中直接使用我的自定义对象,还是在ViewModel中创建同一对象的另一种表示形式。最初我认为使用相同的对象会很好,但随后出现问题。如果视图需要模型的其他功能(例如,如果我希望视图呈现由控制器控制的某些内容,但不依赖于数据模型,该怎么办?控制器如何告诉视图该怎么做?)?此外,我非常希望使用DataAnnotations命名空间中提供的DisplayName和验证属性。如果我想本地化这些数据,我将把资源放在哪里(自定义数据对象不会与网站在同一个程序集中)另外,我希望能够在其他(非Web)应用程序中使用这些对象?
我非常期待听到您的意见。
答案 0 :(得分:1)
有关使用repository
对象正确管理Linq to SQL数据上下文的指导,请参阅http://nerddinnerbook.s3.amazonaws.com/Part3.htm。
有关使用ViewModel
课程的指导,请参阅http://nerddinnerbook.s3.amazonaws.com/Part6.htm。
对于ASP.NET 2.0特定信息,例如数据注释,您最好的资源可能是本书:http://www.amazon.com/Professional-ASP-NET-MVC-Wrox-Programmer/dp/0470643188/ref=pd_sim_b_2
答案 1 :(得分:1)
我已经在我的MVC 2应用程序中选择使用LINQ to SQL接口将SQL直接选择到我的业务对象中,而不是将IQueryable或IEnumerable用作匿名类。我将所有内容选择到新列表中,并在选择中指定将哪个列转换为类本身中的哪个属性/字段。
因此,对于像uri这样的东西,我会将数据库中的字符串选择为类中的字符串字段,MyClass.Url属性将使用它来创建System.Uri。
答案 2 :(得分:1)
对于这两种情况,似乎存储库模式是一个很好的选择,任何人都同意? http://www.asp.net/mvc/tutorials/creating-model-classes-with-linq-to-sql-vb
答案 3 :(得分:0)
虽然我使用了不同的技术(Silverlight),但我遇到了类似的问题。
我仍然在寻找替代方案,但就像你一样,我发现最好为我的所有数据使用自定义对象,而不是Linq-to-Sql生成的数据。我使用这些自定义对象作为共享对象(使用WCF或某些Web服务,在服务器和客户端复制)。在服务器端,我手动将这些自定义对象复制到生成的Linq对象以进行插入/更新/删除(在每个方法中使用单个方法,而不是在整个地方重复)。在客户端,这些自定义对象被共享以与UI绑定。 (您提到的自定义对象中的可空ID仍然有用。)
我知道,创建重复的自定义对象感觉就像许多额外的工作,但生成的代码的当前状态不允许我需要的大多数专用功能(例如Uri vs string,添加其他属性,删除冗余特定于DB的值)。我正在忙着研究MVVM和实体框架,但是,尽管他们做得更好,但他们仍然提供相同的基本挑战。
我希望这会有所帮助。