cub*_*729 5 c# castle-windsor inversion-of-control c#-4.0
我在我的应用程序中使用Castle Windsor的控制反转.首次加载应用程序时,IWindsorContainer.Resolve将组件(特别是工厂)解析为实例.
例如,ILoggerFactory将其解析为MyCustomLoggerFactory(或实现的任何东西ILoggerFactory),其方法CreateLogger()创建记录器.我希望每次上课ILoggerFactory.CreateLogger().但是,我不想传入ILoggerFactory每个类的构造函数.
如何在ILoggerFactory不必IWindsorContainer.Resolve每次呼叫的情况下,每个班级如何访问特定工厂?
据我所知,有三种方法可以从温莎容器中获取依赖项(顺便说一句,您不需要显式解析任何内容,除了可能的一些底层类,只需确保它全部注册到容器中即可并且依赖项已为您连接):
通常,对于专门的日志记录,您会将其作为可选依赖项,因此选择选项 2 并执行类似的操作(我使用了您的 ILoggerFactory 想法,实际上我不会为此定义自己的工厂 - 请参阅下文):
private ILoggerFactory _loggerFactory = LoggerFactory.NullLoggerFactory;
public ILoggerFactory LoggerFactory
{
get { return _loggerFactory; }
set { _loggerFactory = value; }
}
Run Code Online (Sandbox Code Playgroud)
这样,在您的代码中,您可以使用 LoggerFactory 属性,如果尚未将其添加到容器中,您将获得“空”版本(这只是 ILoggerFactory 的一个实例,它创建一个不执行任何操作的记录器),并且如果它具有你得到了真实的版本(你可以在使用它时检查是否为空,或者如果你知道会有一个就使用它)。您可以在需要记录器的类上定义此属性,然后就完成了。
旁白
顺便说一句,您可以使用 Windsor 中的日志记录工具之类的东西- 我对此有一个小问题,因为我真的不希望在整个代码库中使用 Windsor 接口,所以我过去所做的事情是定义的我自己的 ILogger 接口(及其空实现),然后创建一个“城堡记录器代理”,它实现我的 ILogger 接口,但依赖于城堡 ILogger,这是它调用来执行实际日志记录的内容。这样我就可以将其分离到它自己的程序集中,并且我的应用程序不会知道 Windsor 正在注入依赖项。
也许你不在乎,只是觉得我会提到它。