在单页上编写有界上下文

时间:2012-06-06 09:35:24

标签: asp.net-mvc razor domain-driven-design

我正在开始大项目,我想要使用DDD。主要问题是如何在不重复数据和NH映射的情况下显示来自多个有界上下文的数据。我观看了Udi关于复合应用的播客。他提到使用Razor部分来显示来自多个有界上下文的数据,但他没有提供任何细节。有人知道如何使用它或有人知道其他方式吗?

2 个答案:

答案 0 :(得分:1)

关于Razor的好处是它允许你拥有完全独立的控制器,负责渲染单个页面的部分(门户风格)。例如,在您的主Razor视图中:

<some_markup> New products </some_markup>

@{ Html.RenderAction("Get", "NewProducts"); }

<some_markup> Product ratings </some_markup>

@{ Html.RenderAction("Get", "ProductRatings"); }

NewProductsControllerProductRatingsController属于不同的有界上下文,看起来像这样:

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映射。