5

微软网络应用架构相关...

想知道我没有为我的新 Web 应用程序使用 .Net 的 MVC 是否犯了一个错误?我开始在 ASP Classic 中进行 Web 开发,并随着 ASP.net 的每次迭代而前进。在过去的几个月里,我一直在玩弄 ASP.net MVC,只是不喜欢它的某些部分。我喜欢路由、剃刀和查看特定模型的想法。但是,在添加了一些功能之后,我的应用程序似乎变得过于复杂——当我查看 nopCommerce 和 Umbraco 等应用程序的 MVC 版本与之前的版本相比时,我觉得也是如此。

我回去基本上开始编写一个 .Net 网站/MVC 混合体。我为实现数据注释验证的“视图模型”创建了自己的基类;一个简单的映射器,用于将表单提交绑定到模型并将实体属性映射到模型属性,反之亦然;为分页、检查、选择和偶数/奇数等内容创建了扩展方法和助手;runat="server"使用不需要视图状态的重复器、文字和标准 HTML 标记等控件。

这种方法似乎让我可以两全其美,让我的“控制器”代码接近“视图”,并且一切都在中等信任下工作。

这是一些示例代码:

public partial class Admin_Users_RoleAdd : System.Web.UI.Page
{
    protected class RoleAddModel : BaseModel
    {
        [Required, StringLength(100)]
        public string Name { get; set; }
        [StringLength(250)]
        public string Description { get; set; }

        public override bool Validate()
        {
            if (base.Validate() && Cortex.DB.Roles.Any(r => r.Name == Name))
                Errors["Name"] = "Already in use";
            return Errors.Count == 0;
        }
    }
    protected RoleAddModel model = new RoleAddModel();
    protected override void OnInit(EventArgs e)
    {
        if (Request.Form["Submit"].HasValue())
        {
            SimpleMapper.FormMap<RoleAddModel>(model);
            if (model.Validate())
            {
                var entity = new Role();
                SimpleMapper.Map<RoleAddModel, Role>(model, entity);
                Cortex.DB.Roles.AddObject(entity);
                Cortex.DB.SaveChanges();
                Response.Redirect("Roles.aspx");
            }
        }
        base.OnInit(e);
    }
}

和“视图”:

<h1>Add Role</h1>

    <div id="MainForm" class="form">
        <%= model.GetErrorMessage("Error") %>
        <form action="<%= Request.RawUrl %>" method="post">
            <div class="formField">
                <label for="Name">Name</label> <%= model.GetErrorMessage("Name") %><br />
                <input type="text" name="Name" value="<%: model.Name %>" class="required" maxlength="100" />                
            </div>
            <div class="formField">
                <label for="Description">Description</label> <%= model.GetErrorMessage("Description") %><br />
                <textarea rows="8" cols="40" name="Description" maxlength="250"><%: model.Description %></textarea>             
            </div>
            <div class="buttons">
                <input type="submit" name="Submit" value="Create" class="primary" />
                <a href="Roles.aspx">Back</a>
            </div>
        </form>
    </div>

以后我会对这种方法感到遗憾吗?目前我能想到的主要是测试能力,但 VWD Express 无论如何都不支持它。

4

5 回答 5

2

我不喜欢微软在 MVC 上的实现;魔术字符串的使用,说动作然后说控制器似乎有点落后,这就像必须学习一打新语言,因为它充满了微解决方案(路由,剃刀)。

我非常不喜欢它,所以我开始自己写,但我写得越多,我就越意识到它不灵活,我越修复它,它看起来就越像微软的实现。

经过几个小时和几个小时的开发,基本上是一个垃圾版本的 MVC,我放弃了它。我已经开始回顾设计文档和代码并重写(或在)它们的顶部

少写代码

我在大约八小时内将我糟糕的 MVC 应用程序的 UI 层重写为 MS MVC。在那之前,我已经为此工作了大约八周。当然,大部分想法已经完成,因此从头开始编写 MVC 可能不会那么快。

我使用的几乎所有东西都是开箱即用的,除了 AuthorizeAttribute 类,它只是没有做我想要它做的事情。

为什么这与您的问题有关?

在不需要的时候编写代码是错误的。如果您已经尝试并测试过库,请重用它们,如果没有,请在编写自己的库之前从可信赖的来源中寻找它们。我的问题都不是新问题,我怀疑你的问题是否也是。那些拥有比我们大多数人更多的资源的人都已经解决了这些问题。

我应该停止重新发明轮子,只对没有预先打包的东西进行编码,部分原因是我正在工作中进行迁移项目,律师讨论与某些加密例程相关的 IP 的更精细点。我们将需要花费数周时间编写一些代码来将数据转换为另一种格式,因为我们不能“泄露”用于保护数据的 IP。如果该应用程序只是用罐装库编写的,那将只是我们需要交出的数据和加密密钥。它现在就完成了,而不是让律师们讨论的第十稿。

于 2012-08-23T21:49:42.163 回答
2

一个好的、编写良好的、可维护的和可靠的应用程序是这样的,无论用于开发它的技术是什么。您可以使用任何语言或框架编写好代码和坏代码。随着时间的推移,我们获得了使我们作为开发人员的生活变得更轻松的工具,但是如果您一开始就是一个优秀的开发人员,那么您碰巧使用哪种 MVC 框架或 XML 解析器并不重要。

于 2012-08-23T21:20:38.467 回答
0

这个没有正确答案。

唯一能想到的答案是这样的:合适的工具做合适的工作

虽然我个人的看法是经典的 ASP.NET 是非常前天的。是的,他们从你那里抽象出 HTML,但是,嘿,他们开始所有这个 MVC 项目是有原因的——人们(专业人士)不满足于将 web 编写为经典应用程序,无法控制渲染,没有结构。此外,MVC 考虑了经典 ASP.NET 之后出现的所有现代 Web 技术。Ruby on Rails 就是一个很好的例子——DRY & COC 原则。MVC 模式还使您的应用程序更加结构化,并提供了很好的关注点分离......

适合工作的正确工具

于 2012-08-23T22:29:03.200 回答
0

你可以做任何对你有用的事情。如果您是唯一的开发人员,并且永远都是,并且您深刻理解您进行开发的方式,那么就去做吧。

大多数方法都是关于改善长期维护的。维护占程序生命周期内总成本的 95% 之多。

但是通过混合架构,您可能会为自己设置不兼容,这些不兼容可能由于架构之间的阻抗不匹配而难以修复。

当 MVC 的模型绑定工作得很好时,我对你为什么编写自己的模型绑定器感到有点困惑。或者为什么您觉得需要进行自己的数据注释验证。但无论如何,这是您的代码。

如果你不喜欢 MVC,你可以考虑使用 fubumvc 或 spring.net 之类的东西

于 2012-08-23T21:13:17.857 回答
0

我参与过或有同事的一些公司的趋势是,他们都从经典的 ASP 转向至少编写 .Net WebForms,而从事 .Net WebForms 的公司现在正在转向 MVC!

于 2012-08-23T21:15:43.063 回答