【问题标题】:structureMap in a multiTier application多层应用程序中的结构映射
【发布时间】:2011-01-23 05:09:14
【问题描述】:

我有一个包含三层的 asp.net mvc 应用程序 1.dataAccess层(类库) 2.业务层(类库) 3. web层(asp.net mvc项目)

还有一个领域项目(poco 的类库)

我正在 MVC 项目的 Application_start 中进行结构映射映射,但是要映射 dataAccesslayer 中的类型(例如,带有 IPersonReository 的 personRepository),我需要在我的 Web 层中引用 DAL,我认为这是不正确的.

你有什么建议 谢谢

【问题讨论】:

    标签: asp.net-mvc dependency-injection structuremap


    【解决方案1】:

    作为一种务实的方法,如果你能保持纪律并且永远不要使用来自 Web 层的 DAL,那么你正在做的事情可能还可以。然而,一旦有了参考资料,这可能就很难做到——那么项目中的其他开发人员呢?

    更好的选择是将网络层分成两层

    1. 应用程序引导层。这是真正的 Web 项目,但除了引导容器和实现视图(.aspx 页面)之外,应该没有别的了。这就是我们所说的Humble Executable。它将包含对所有其他项目的引用,以便组合它们(通过 DI 容器),但除此之外它什么也不做。我们称之为Register Resolve Release pattern

    2. 应用模型层。该项目将包含您的所有应用程序逻辑(与域逻辑相反):查看模型和控制器。它不需要对 DAL 的引用,但会通过 DI 容器将实现注入其中。

    【讨论】:

    • 非常感谢 Mark...Application Bootstrapping 层将是一个 asp.net mvc 项目,Application Model 层将是一个类库项目?
    • 是的,应用模型层可以是一个类库项目,但是由于控制器将在那里,它仍然会引用适当的 ASP.NET MVC 程序集。
    【解决方案2】:

    只要您不直接调用该程序集,在您的 Web 项目中引用 DAL 就没有错。但是,如果您对这种方法感到不舒服,您可以在业务层中使用注册表,并在那里为 DAL 注册类型。由于 Web 层无论如何都需要对业务层的引用,因此您可以从 Web 的应用程序开始中的业务层使用该注册表

    这里是一些示例代码

    Bsns 层中的注册表类

    public class BusinessRegistry:Registry
    {
        public BusinessRegistry()
        {
             For<IDALInterface1>().Use<DALImpl1>();
        }
    }
    

    并在应用程序启动方法中

    var container = new Container(x => x.AddRegistry(new BusinessRegistry()));
    

    【讨论】:

    • 如果假设有 5 层会怎样……虽然我们可以在每一层中创建注册表,但我们必须仅在 application_start 中初始化它们……所以无论如何我们都需要参考在所有 5 层中...有什么解决方法...
    • 5 层表示 5 个项目。如果是这样的话,我会回去重新设计整个事情。项目越少越好。无论如何,对于你原来的问题,我会推荐下面@Seemann 的建议,有一个引导项目,可以用所有依赖项初始化 DI 容器
    【解决方案3】:

    正如其他人所说,对您的 DAL 项目的引用并不是世界末日,除非您错误地使用它(或者可能在您的 Web 项目中根本没有)。我更喜欢让基础设施项目包含与横切关注点相关的所有内容。其中包括我的日志记录和 IoC 容器。

    【讨论】:

    • 感谢贾斯汀的回答,但我认为首先没有参考是安全的..
    • 我同意这就是为什么我的回答会告诉您如何从您的网络中删除对 Dal 的引用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    相关资源
    最近更新 更多