5

我在尝试布局我的 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由于循环依赖不能调用Workflow中的方法。

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

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

我怎样才能使消费者只引用商业内容的服务命名空间,而我在 WWF 中暗示这些商业内容的事实对消费者是隐藏的?

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

这里有一些代码可以帮助解释。

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.
    }
}

谢谢窥视。

4

3 回答 3

1

你看过 Rob Connery 的 MVC Storefront/ Kona项目吗?他正在与 WF 做非常相似的事情,他的项目也以某种类似的方式布局。这可能是您正在做什么的很好的指导。我知道他在设计集成时确实与一些 Workflow Foundation 专家合作。

于 2009-04-08T14:39:45.863 回答
0

一个可能的解决方案是添加一个“应用程序”层

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

并从 UI 调用应用层。当然,在大多数情况下,应用层只会将调用转发到服务或工作流。

于 2009-04-08T14:42:03.970 回答
0

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

于 2009-04-08T14:55:23.313 回答