【问题标题】:Where to put *advanced* business logic in ASP.NET MVC/Linq2Sql project?在 ASP.NET MVC/Linq2Sql 项目中将*高级*业务逻辑放在哪里?
【发布时间】:2009-11-12 20:33:01
【问题描述】:

我正在使用 ASP.NET MVC、LINQ2QL 和存储库设计模式完成对项目管理工具的重写。几乎遵循 NerdDinner 示例。

我有一个名为 Task 的类,它有一个 TaskStages 的子列表。就本示例而言,阶段已就绪、正在开发和已完成。我会跟踪 Task 的当前 Stage,但每次 Stage 发生变化时,我都想将历史记录写入 Task Stage 表。

我正在努力寻找该功能并保持可测试性。它进入控制器吗?存储库?还是部分类?

如果这是设计问题,请告诉我!

【问题讨论】:

    标签: asp.net-mvc linq-to-sql repository-pattern


    【解决方案1】:

    你可以用两种方法中的一种来处理。

    就个人而言,我会创建位于控制器和数据访问(存储库/LINQ2SQL)之间的业务对象。然后,您可以将这些对象用作您的模型并通过它们与数据进行交互。

    您也可以将逻辑放在控制器中...但是如果应用程序的多个区域需要以相同的方式执行,则您必须全面重复该逻辑。

    【讨论】:

    • 我真的想保持应用程序精简,所以如果我不必创建一个真正的业务对象,那将是我想要的方式。为了正确测试它,我想我必须把它放在控制器中......不是吗?
    • 我想知道是否可以在存储库中添加一个 update() 方法,然后我可以在那里进行检查?
    • Repo 真的不应该用于业务逻辑 - 仅用于数据访问。如果必须,请将其放入控制器中。必须像贾斯汀一样,我会建议另一层抽象:域对象和服务层。这不是大量的工作,您将立即获得回报。
    • 这看起来是处理它的最佳方式......我试图远离这个......我们在很多其他项目中使用 Csla,并且真的在寻找快速和肮脏的!感谢您的建议!
    【解决方案2】:

    ...每次舞台变化我都想 向Task写入历史记录 舞台桌。

    你需要有一个服务来负责改变 Stage:

    public interface IStageChanger {
        void Rename(Task t, string newName);
        // etc
    }
    

    我正在为把它放在哪里而苦苦挣扎 功能和维护 可测试性。是否进入 控制器?存储库?或部分 上课?

    两者都没有。服务水平。您可以让另一个服务负责写入历史记录,因此 IStageChanger 的最终实现将与此类似:

    public class StageChanger : IStageChanger {
        public StageChanger(ITaskHistoryWriter historyWriter) {
            // 
        }
    
        public void Rename(Task t,string newName) {
            history.Write(t, /*whatever*/)
        }
    }
    

    然后您使用 DependencyInjection 容器(Windsor 或类似容器)只需请求您的更换器服务。

    【讨论】:

      【解决方案3】:

      我是 ASP.NET MVC 的新手,但我会在类上有一个用于更改阶段的方法,并将用于跟踪这些更改的逻辑放在该方法中(必要时进行重构)。简而言之,我认为这不明确属于控制器。

      【讨论】:

      • 我也有同样的想法......但在如何上苦苦挣扎。我必须创建存储库的一个实例来执行我​​需要执行的任何数据访问。
      猜你喜欢
      • 2010-10-06
      • 2013-09-04
      • 2014-10-10
      • 2011-12-26
      • 1970-01-01
      • 2011-08-02
      • 2011-06-03
      • 1970-01-01
      • 2011-08-02
      相关资源
      最近更新 更多