C# 在MVC web应用程序中,让多个web应用程序使用公共控制器库是一种不好的做法吗?

C# 在MVC web应用程序中,让多个web应用程序使用公共控制器库是一种不好的做法吗?,c#,asp.net-mvc,C#,Asp.net Mvc,目前,我们正在创建一套前端web应用程序,这些应用程序共享许多视图/控制器。将这些公共控制器和视图放在共享项目中是否不好。我们使用的是夏普体系结构。为什么认为将普通事物集中化是不好的?看看替代方案。在许多地方复制相同的东西会有什么好处 这几乎是对@Arjang的直接回应。“什么时候集中处理公共事务不好?” 对于这个答案,我将使用以下用例。Jeff的Widget Supply是一家拥有电子商务店面的公司。它们有以下正在使用的应用程序: 公共电子商务网站 内联网电子商务管理员 用于供应商集成的数据仓

目前,我们正在创建一套前端web应用程序,这些应用程序共享许多视图/控制器。将这些公共控制器和视图放在共享项目中是否不好。我们使用的是夏普体系结构。

为什么认为将普通事物集中化是不好的?看看替代方案。在许多地方复制相同的东西会有什么好处

这几乎是对@Arjang的直接回应。“什么时候集中处理公共事务不好?”

对于这个答案,我将使用以下用例。Jeff的Widget Supply是一家拥有电子商务店面的公司。它们有以下正在使用的应用程序:

  • 公共电子商务网站
  • 内联网电子商务管理员
  • 用于供应商集成的数据仓库服务
  • 航运企业内部网应用
  • 发送电子邮件需要所有这些不同的应用程序

  • 公共电子商务网站发送HTML格式的电子邮件,内容包括订单确认和重置密码
  • 当员工更改价格或分配错误或支持票证时,内部网站会发送电子邮件。出于客户服务的原因,必须存储这些电子邮件,以便员工可以查找以前的信件
  • 当集成任务或处理作业失败时,供应商集成会发送状态电子邮件,让供应商和Jeff的小部件提供出错的信息
  • Shipping Intranet应用程序发送与USPS和UPS集成的装运通知

    • 内部网站点位于VPN内部,需要特殊的服务器配置
    • 供应商应用程序需要支持附件
    • 内部网电子商务应用程序需要支持设置优先级
  • 4种不同的应用,4种不同的用例

    因此,让我们看看发送电子邮件所需的代码:

    MailMessage mail = new MailMessage();
    mail.To = "anaddress@email.com";
    mailFrom = "anaddress@email.com";
    mail.Subject = "growsize@spam.com;
    mail.Body = "lies";
    SmtpMail.SmtpServer = "localhost";
    SmtpMail.Send(mail);
    
    所以Joe Schmoe developer说:“我知道,由于所有这些应用程序都具有相同的功能,我将把电子邮件代码放在JeffWidget.Core库中,我们将使用相同的代码发送电子邮件!”

    然后Joe添加了一个新的配置部分,这样VPN就可以获得特殊的访问权限,每个人都可以用同样的方式配置电子邮件发送者。然后,他添加了一种基于文本的电子邮件方法。然后,他添加了一种包含附件的方法。然后,他添加了一种设置优先级的方法。然后有人需要一种方法来添加抄送和密件抄送。然后其中一个应用程序需要一种特殊的方式来记录电子邮件。然后有人需要添加一个与营销数据库集成的时事通讯系统。然后,然后,然后

    现在Joe是一个很棒的程序员,他已经尽了最大的努力,但是因为所有的应用程序都使用同一个电子邮件发送者,所以为了共享一点微不足道的功能,他将整个应用程序集紧密地耦合在一起

    依我看,这比用一个重复的类和十几行代码来发送电子邮件要糟糕得多。耦合将在同一套件或业务域中的应用程序之间发生,但这种耦合通常通过数据发生。客户在所有应用程序中都是同一客户,但这是否意味着其行为方式相同?有没有真正的继承权

    问题在于,当每个使用者只调用共享功能的一小部分时,共享代码的长度是否小于其片段的总和。它就像Liskov替换原则一样,只是在更大的范围内严重损害了您的项目敏捷性

    Greg Young在他的一次演讲中更好地解释了其中的一些事情:

    只要你不过度,这是一个很好的做法。我在公共库中设置了视图/控制器。维护共享功能要容易得多,每个web应用程序的代码也要干净得多。我还可以通过引用公共库快速建立一个新的web应用程序

    您需要做几件事来确保不会从消费web应用程序中拿走任何东西:

    • 使用基本控制器类,而不是单独的控制器,并使所有操作方法都是虚拟的
    • 确保文件系统中存在的视图将覆盖库中嵌入的视图

    如果您有一个移动版本和一个包含相同逻辑的web应用程序的普通版本,那么最好将这些控制器提取到一个共享程序集。