【问题标题】:Proper use of Windsor container inside ASP.NET and ASP.NET MVC在 ASP.NET 和 ASP.NET MVC 中正确使用 Windsor 容器
【发布时间】:2011-03-13 18:42:37
【问题描述】:

对于一个新项目,我使用 Windsor 容器来提供依赖注入 (DI)。 DI 应该为我提供松散耦合和高可测试性。由于我对依赖注入这个主题不熟悉,所以我很难弄清楚如何正确使用它。

这是我从文章和谷歌搜索中学到的:您应该让容器在启动时创建一个瞬间运行。在创建对象时应注意对象的依赖关系。嗯,到目前为止一切顺利。

现在说说我的情况。在另一个项目中的数据层内部,我的数据类依赖于在构造函数中设置的某种形式的日志记录。但由于它位于不同的项目中,因此无法访问容器。

唯一想到的解决方案是创建一个类似单例工厂的类,在启动时将容器注入其中。单例工厂持有容器实例和数据层类实例的项目创建,就像传统工厂类所做的那样,现在使用 DI。

虽然这似乎是一个很好的解决方案,但阅读一些文章让我觉得我错过了一些重要的东西,还有其他选项可以实现我想要的结果(我的数据层类是用 DI 创建的)。所以我可以使用来指导。源代码示例会很棒,但其他资源的解释或链接也会对我有很大帮助。

【问题讨论】:

    标签: asp.net dependency-injection castle-windsor


    【解决方案1】:

    我最近写了几篇博文,您可能会觉得有用。

    基本上这个想法是 - 除了 Global.asax 之外,您不必在任何地方引用您的容器

    【讨论】:

    • 不错的文章,但我仍然不清楚。我在 global.asax 中注册了容器。我在容器内注册了我的数据层类使用的记录器。但是当我创建一个数据层类的新实例时,我仍然需要提供我的记录器。由于我无法直接引用容器,我该怎么做?一定有一些我缺少的概念。任何帮助将不胜感激。
    • 你的 DAL 类有一个带有 ILogger 参数的 .ctor 就足够了
    • 这只有在你调用 Container.Resolve(); 时才成立;因为我不应该直接与容器交互,这是不可能的。但是 SomeDALClass class= new SomeDALClass();不起作用和/或编译。所以我仍然在某些地方做错了。
    • 你都不叫。就像我在帖子中写的那样,你不应该拉 dal 类 - 通过构造函数显式依赖它,容器会为你处理这个。
    • 首先,感谢您一直以来的耐心和帮助。但我必须在某处创建我的类的实例。也许它会帮助我举一个更具体的例子。我在 DAL 层中使用 NHibernate。我的 NHibernate 存储库依赖于日志记录组件。两者都在容器中注册。但是必须在代码中创建我的存储库的实例才能从 NHibernate 查询数据。所以我必须创建我的存储库的实例,但我不能,因为手动创建实例需要我提供日志记录组件。我该怎么做呢?
    【解决方案2】:

    这篇文章很好地概述了设置您的 ASP.NET MVC 项目以使用 Windsor 来解决您的控制器依赖项。正如 Krzsztof 所说,您应该只引用 Global.asax 中的容器。

    http://blog.andreloker.de/post/2009/03/28/ASPNET-MVC-with-Windsor-programmatic-controller-registration.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-16
      • 2011-10-24
      • 1970-01-01
      • 1970-01-01
      • 2012-03-08
      • 1970-01-01
      相关资源
      最近更新 更多