在ASP.NET MVC / Linq2Sql项目中放置*高级*业务逻辑的位置?

时间:2009-11-12 20:33:01

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

我正在使用ASP.NET MVC,LINQ2QL和Repository设计模式重写项目管理工具。几乎遵循NerdDinner的例子。

我有一个名为Task的类,它有一个TaskStages的子列表。为了这个例子,阶段是准备好,正在开发和完成。我跟踪任务中的当前阶段,但每次阶段更改时我都想将历史记录写入任务阶段表。

我在努力放置这个功能并保持可测试性。它是否进入控制器?库?或部分类?

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

3 个答案:

答案 0 :(得分:2)

您可以采用以下两种方式之一。

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

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

答案 1 :(得分:2)

  

...每次舞台改变我想要   将历史记录写入任务   舞台表。

您需要有一个负责更改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或类似的)只是请求你的转换器服务。

答案 2 :(得分:0)

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