我正在开始大项目,我想要使用DDD。主要问题是如何在不重复数据和NH映射的情况下显示来自多个有界上下文的数据。我观看了Udi关于复合应用的播客。他提到使用Razor部分来显示来自多个有界上下文的数据,但他没有提供任何细节。有人知道如何使用它或有人知道其他方式吗?
答案 0 :(得分:1)
关于Razor的好处是它允许你拥有完全独立的控制器,负责渲染单个页面的部分(门户风格)。例如,在您的主Razor视图中:
<some_markup> New products </some_markup>
@{ Html.RenderAction("Get", "NewProducts"); }
<some_markup> Product ratings </some_markup>
@{ Html.RenderAction("Get", "ProductRatings"); }
NewProductsController
和ProductRatingsController
属于不同的有界上下文,看起来像这样:
public class NewProductsController {
private readonly IProducts repository;
public NewProductsController(IProducts repository) {
...
}
[ChildActionOnly]
public ViewResult Get() {
// load products from repository and
// return corresponding ViewModel
}
}
public class ProductRatingsController {
private readonly IProductRatings repository;
public ProductRatingsController(IProductRatings repository) {
...
}
[ChildActionOnly]
public ViewResult Get() {
// load product ratings from repository and
// return corresponding ViewModel
}
}
请注意,尽管控制器将在同一页面上显示数据,但它们并不相互了解。可以使用应用程序Composition Root中的DI容器注入存储库。
答案 1 :(得分:1)
关于NH映射,每个有界上下文(BC)应该有自己的映射集,因此它应该有自己的会话工厂。配置DI容器以使其为每个相应的BC解析相应的会话工厂可能很棘手,因为会话工厂接口必须被“标记”以与特定BC相关联,然后该BC内的所有依赖关系也将必须与该标签相关联。另一种选择是创建一个开放的主机服务(例如REST)来封装每个BC,然后从您的Web应用程序引用该服务。这样您就不必担心在Web应用程序中管理NH映射。