【问题标题】:ASP.NET MVC 2 Architecture and LINQ data modelASP.NET MVC 2 体系结构和 LINQ 数据模型
【发布时间】:2011-04-10 21:37:08
【问题描述】:

我正在创建我的第一个更大的 ASP.NET MVC 应用程序。在思考了一段时间的应用架构之后,我想我会听到一些其他的意见。

我正在为我的数据层使用 LINQ-SQL。但是,我不打算在整个应用程序中使用 LINQ 对象,因为我希望某些字段有一些更具体的数据类型(例如,我希望 Url 字段是 System.Uri 类型,而不是 System.String)。似乎传递 LINQ 对象也不是一个好主意,因为 DataContext 可能并不总是可用。我绝对希望在这方面有一些 cmets。

我创建了一些更具体的对象来表示我的数据。 LINQ 对象可以解析为这些对象,我创建了一些 DataClient 类,它们利用 LINQ DataContext 检索数据,然后将其解析为我的自定义对象并返回。这允许仅将 LINQ-SQL 用作数据层。

现在想到一个并发症。如何更新数据库中的对象值。我仍在争论是否使用我的自定义对象(因此需要相关属性具有设置器)作为更新方法的参数。如果我采用这种方法,我计划将 Id : int 属性设为可为空的类型,并且只有在将 LINQ 数据对象解析为自定义对象时才能设置 Id 属性。我认为这是有道理的,因为数据库是唯一实际分配标识符的地方。

这种方法不会让我在没有先从数据库中检索记录的情况下更新记录,即使我知道 ID。另一方面,我可以制作将每个字段作为参数的更新方法。但是,这似乎是很多双重代码。

现在是 MVC 模型。我不确定是否直接在视图中使用我的自定义对象,或者是否创建同一对象的另一个表示以在 ViewModel 中使用。最初我认为使用相同的对象会很好,但随后问题开始出现。如果视图需要模型的其他功能怎么办(即,如果我希望视图呈现由控制器控制但不依赖于数据模型的东西怎么办。控制器如何告诉视图做什么?)?此外,我非常想使用 DataAnnotations 命名空间中可用的 DisplayName 和验证属性。如果我想本地化这些数据,我会将资源放在哪里(自定义数据对象不会与网站在同一个程序集中)另外,我希望能够在其他(非 Web)应用程序中使用这些对象?

我非常期待听到您的 cmets。

【问题讨论】:

    标签: .net asp.net-mvc linq architecture


    【解决方案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

    【讨论】:

      【解决方案2】:

      我已在我的 MVC 2 应用程序中选择使用 LINQ to SQL 接口将 SQL 直接选择到我的业务对象中,而不是使用 IQueryable 或 IEnumerable 作为匿名类。我将所有内容都选择到新列表中,并在选择中指定将哪一列转换为类本身的哪个属性/字段。

      因此,对于 uri 之类的内容,我会从数据库中选择字符串到类中的字符串字段中,MyClass.Url 属性将使用该字段来创建 System.Uri。

      【讨论】:

        【解决方案3】:

        似乎存储库模式对于这两种情况都是一个不错的选择,有人同意吗? http://www.asp.net/mvc/tutorials/creating-model-classes-with-linq-to-sql-vb

        【讨论】:

          【解决方案4】:

          虽然我使用了不同的技术(Silverlight),但我面临着类似的问题。

          我仍在寻找替代方案,但就像您一样,我发现最好对我的所有数据使用自定义对象,而不是使用 Linq-to-Sql 生成的对象。我将这些自定义对象用作共享对象(使用 WCF 或某些 Web 服务,在服务器端和客户端复制)。在服务器端,我手动将这些自定义对象复制到生成的 Linq 对象以进行插入/更新/删除(每个方法都使用一个方法,而不是到处重复)。在客户端,这些自定义对象被共享以与 UI 绑定。 (您提到的自定义对象中的可为空 ID 仍然有用。)

          我知道,创建重复的自定义对象感觉需要做很多额外的工作,但是生成的代码的当前状态不允许我需要的大多数特殊功能(例如 Uri 与字符串、添加其他属性、删除冗余DB 特定值)。我正忙于研究 MVVM 和实体框架,但是,尽管它们在某些方面做得更好,但它们仍然提供了相同的基本挑战。

          我希望这会有所帮助。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-12-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-10-05
            • 1970-01-01
            • 2011-09-01
            • 1970-01-01
            相关资源
            最近更新 更多