我在尝试布局我的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.
}
}
谢谢偷看。
答案 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。