【问题标题】:StructureMap n-tier appsStructureMap n 层应用程序
【发布时间】:2011-06-27 06:56:11
【问题描述】:

我正在尝试在我的 ASP.Net MVC 3 应用程序中实现 StructureMap。我的架构遵循 n 层方法,其中我的 UI 层与我的服务层对话,后者又与我的业务层对话,而我的业务层又与存储库层对话。我有代表流经所有层的数据的数据合约。

我的 UI 层应该只知道服务层。我的 UI 不应该知道或关心业务,更不用说存储库或数据层了。每一层都是它自己的程序集,我使用构造函数依赖注入来注入必要的实例(即,我将业务对象注入到我的服务构造函数中,并将存储库对象注入到业务构造函数中)。

所以,如果我的层在单独的程序集中,并且结构图所在的 UI 程序集不知道较低的层,那么如何配置结构图?我不愿意在我的 UI 层中创建对位于服务层后面的所有“较低”层的引用。如果我这样做,那么这可能会为 UI 直接与数据库对话打开大门,这很糟糕。

请帮忙。

谢谢

汤姆

【问题讨论】:

  • 你试过了吗?我相信它会扫描整个应用程序域,其中应该包括所有程序集。不过,我可能是错的;)
  • @RexM 你没有错。如果能找到所有程序集,StructureMap 确实可以连接它们。

标签: asp.net-mvc-3 structuremap n-tier-architecture


【解决方案1】:

去过那里。像你一样直接采取了想法,认为避免程序集引用将解决所有问题。我什至设法通过构建后 xcopy'ing 构建的 dll 来完成您尝试做的事情。实际上 - 这只是让它比预期的更混乱。

问题是 - 引用本身并不是万恶之源。 It's fine 引用来自最上面 (UI) 程序集的所有内容。糟糕的代码会导致麻烦。

【讨论】:

    【解决方案2】:

    我不愿意在我的 UI 层中创建对位于服务层后面的所有“较低”层的引用。如果我这样做,那么这可能会为 UI 直接与数据库对话打开大门,这很糟糕。

    您应该将所有较低层引用到配置 DI 容器的最终 ASP.NET 应用程序中。部署时所有程序集都必须位于bin 文件夹中,否则您的应用程序将无法运行。

    UI 层(ASP.NET 应用程序)不直接与数据库通信。如果您正确抽象了您的服务,它会与服务抽象对话,后者与存储库抽象对话,具体取决于您如何配置 DI 与数据存储对话。

    【讨论】:

      【解决方案3】:

      对于将依赖关系连接到整个链条的结构映射,它将需要访问您实际要使用的所有程序集。

      这并不意味着 UI 必须引用这些(尽管这可能是最简单的解决方案)

      你可以让你的 UI 引用程序集只包含它需要的接口,而不知道这些接口的实现(或它们有什么依赖关系)

      这意味着您的 UI 应该只知道您的服务层接口。

      但是为了让您的应用程序能够一起使用所有不同的部分,它必须知道要使用哪个服务实现,并且必须知道实现需要使用的任何依赖项的哪个实现,等等一路走来。这一切都应该在一个地方完成(我认为是 ASP MVC 应用程序中的 global.ashx),并且这是唯一应该存在对容器或其他实现类的任何引用的地方。

      您的应用程序是您所有层的组合。这不仅仅是您的 UI。

      如果您根本不想引用这些程序集,那么您可以通过 xml 配置结构映射,然后可能会动态加载程序集。我不确定,但我认为它应该有效。不过xml配置比较麻烦。

      只要您的服务接口被注入到您的 UI 控制器中,那么您应该是相当安全的。对于使用来自引用的 dll (如 db 层)之一的新依赖项的人来说,他们必须将该接口引入控制器并将其与结构映射连接起来,这应该很容易发现。

      【讨论】:

        猜你喜欢
        • 2013-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-04
        • 2016-10-17
        • 1970-01-01
        相关资源
        最近更新 更多