如何构建这个ASP.NET n层解决方案?

时间:2009-04-08 14:21:01

标签: asp.net-mvc visual-studio-2008 architecture workflow-foundation n-tier-architecture

我在尝试布局我的VS解决方案时遇到问题,我想要一些建议。

目前,我的解决方案布局类似于以下项目: -

Foo.Models
Foo.Repositories
Foo.Services
Foo.Web (an ASP.NET MVC application)

我的网站(Foo.Web)调用Foo.Services命名空间上的各种方法。这里的想法是Services处理所有业务逻辑Model命名空间只是POCO个对象。 Repositories命名空间是自我解释的。

带接口的

构造函数依赖注入处理什么层需要什么组件的黑魔法。

  

问题:我想添加一些Windows   Workflow Foundation(WWF)代码进入   解决方案,但把这个WWF代码放入   相同的Foo.Services.dll。

为此,我需要创建另一个Workflow类型的项目。此工作流具有调用Foo.Services方法的活动。因此,我的网站现在必须调用服务方法或工作流方法来做事情。

我希望网站只调用Services命名空间来做事情。

毕竟,该服务是UI和业务逻辑IMO之间的主要接口。我在技术上使用WWF这一事实不应该成为IUI前端编码人员关注的问题。

由于工作流dll调用Services dll中的方法,因为循环依赖,Services dll无法调用工作流中的方法。

我也无法将所有工作流代码移到服务dll中,因为Services dll需要是一些特殊的项目类型(Windows Workflow类型)。

所以..我不知道该怎么办?

我怎样才能让消费者只引用服务名称空间来处理商业资料,而且我在WWF中隐藏这些商业资料的事实对消费者来说是隐藏的?

我是否需要制作一个WWF项目并将我的所有服务代码移入其中,扔掉旧的服务项目?这样做并非“听起来非常可重复使用”。如果我决定不使用WWF处理某些pipline操作并使用其他内容会发生什么?

以下是一些有助于解释的代码。

HomeController.cs
public ActionResult Index()
{
   // StockService was created using constructor dependency injection.
   var viewData = _stockService.GetStocks(StockType.MostPopular);
   return (viewData)
}

StockService.cs
public class StockService : IStockService
{
    public IEnumerable<Stock> GetStocks(StockType stockType)
    {
        // Dependency Injection defines if the Pipeline is WWF
        // or something else (eg. plain ole functions).
        var stocks = _stockPipeline.GetStocks(stockType);

        // Cache result.

        // Update repostiory. (example of calling the repository)
        _sqlRepostiory.SaveSomeRandomData("Jon Skeet Was Here.");

        return stocks. // Returns a POCO.
    }
}

谢谢偷看。

3 个答案:

答案 0 :(得分:1)

您是否看过Rob Connery的MVC店面/ Kona项目?他正在做a very similar thing with WF,他的项目是laid out in a somewhat similar way。对于你正在做的事情,它可能是good guidance。我知道他确实与一些Workflow Foundation专家合作设计了他的集成。

答案 1 :(得分:0)

可能的解决方案是添加“应用”层

Application ---> Services
                    ^
                    |
            \--> Workflow

从UI调用应用程序层。当然,在大多数情况下,应用程序层只会转发对服务或工作流的调用。

答案 2 :(得分:0)

仅供参考 - 可以修改非工作流程项目以允许添加工作流程类。详情here