我在尝试布局我的 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.
}
}
谢谢窥视。