ASP.NET和ASP.NET MVC中Windsor容器的正确使用

ASP.NET和ASP.NET MVC中Windsor容器的正确使用,asp.net,dependency-injection,castle-windsor,Asp.net,Dependency Injection,Castle Windsor,对于一个新项目,我使用Windsor容器来提供依赖注入(DI)。DI应该为我提供松耦合和高测试性。因为我对依赖注入这个主题还不熟悉,所以我很难理解如何正确地使用它 这是我在文章和谷歌搜索中学到的:您应该有一个容器运行的瞬间,它是在启动时创建的。在创建对象时,应注意对象的依赖关系。嗯,到目前为止还不错 现在谈谈我的情况。在另一个项目中的数据层中,我的数据类依赖于构造函数中设置的某种形式的日志记录。但由于它位于不同的项目中,因此无法访问容器 脑海中浮现的唯一解决方案是创建一个类似于单例工厂的类,在启

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

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

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

脑海中浮现的唯一解决方案是创建一个类似于单例工厂的类,在启动时将容器注入其中。与传统工厂类一样,singleton工厂保留容器实例和数据层类实例的项目创建,而现在使用DI


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

我最近写了几篇博客文章,你可能会觉得有用


基本上,这个想法是-除了Global.asax之外,您不应该在任何地方引用您的容器。这篇文章很好地概述了如何设置ASP.NET MVC项目以使用Windsor解决控制器依赖关系。正如Krzsztof所指出的,您应该只在Global.asax中引用容器


不错的文章,但还有一些我不清楚的地方。我在global.asax中注册容器。我在容器中注册了我的数据层类使用的记录器。但是,当我创建一个数据层类的新实例时,我仍然需要提供我的记录器。既然我不能直接引用容器,我该怎么做?一定有一些概念我遗漏了。任何帮助都将不胜感激。事实上,DAL类有一个带ILogger参数的.ctor,这仅在调用Container.Resolve()时才是正确的;因为我不应该直接与容器交互,这是不可能的。但是SomeDALClass=新的SomeDALClass();无法工作和/或编译。所以我在某些地方仍然做错事,你两个都不说。就像我在我的帖子中写的,你不应该拉dal类-通过构造函数显式依赖它,容器会为你处理这个问题。首先,感谢你的耐心和帮助。但是我必须在某个地方创建我的类的实例。也许我可以举个更具体的例子。我在DAL层中使用NHibernate。我的NHibernate存储库依赖于日志组件。两者都在集装箱登记。但是,我必须在代码中创建我的存储库实例,以便从NHibernate查询数据。所以我必须创建存储库的实例,但我不能,因为手动创建实例需要我提供日志组件。我该怎么做呢?