代码之家  ›  专栏  ›  技术社区  ›  mattruma

在ASP.NET MVC/Linq2SQL项目中,将*高级*业务逻辑放在哪里?

  •  1
  • mattruma  · 技术社区  · 15 年前

    我正在使用ASP.NET MVC、Linq2ql和存储库设计模式完成项目管理工具的重写。几乎都是以Nerddinner为例。

    我有一个叫做task的类,它有一个taskStages的子列表。为了这个例子,阶段已经准备好了,正在开发中,并且已经完成了。我跟踪任务的当前阶段,但每次阶段更改时,我都要将历史记录写入任务阶段表。

    我正在努力寻找将此功能放在何处并维护可测试性。它在控制器里吗?仓库?还是部分阶级?

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

    3 回复  |  直到 15 年前
        1
  •  2
  •   Justin Niessner    15 年前

    你可以用两种方法来解决这个问题。

    我个人会创建位于控制器和数据访问(repository/linq2sql)之间的业务对象。然后将这些对象用作模型,并通过它们与数据交互。

    您也可以将逻辑放入控制器中……但是如果应用程序中有多个区域需要以相同的方式执行,那么您必须在整个板上重复该逻辑。

        2
  •  2
  •   Dmytrii Nagirniak    15 年前

    …每次我想改变舞台的时候 将历史记录写入任务 舞台台。

    您需要有一个负责改变阶段的服务:

    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容器(温莎或类似容器)只需请求换碟机服务。

        3
  •  0
  •   Mayo    15 年前

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