我是新来的温莎城堡,所以请原谅我,如果我只是错过了这里一个明显的功能...城堡温莎 - 控制创造暂态分量的
我目前正在从单纯DI城堡切换工作项目。我有几个组件,它们具有ILogger类型的属性依赖项。我的LoggerImpl经由静态工厂方法创建这样的:
LoggerImpl.GetLogger("LoggerName");
构造对象树时,其具有ILogger依赖目前每个组件(纯DI)接收指定logger例如:
var component1 = new MyComponent1(dependencies...);
component.Logger = LoggerImpl.GetLogger("Component1Logger");
var component2 = new MyComponent2(dependencies...);
component.Logger = LoggerImpl.GetLogger("Component2Logger");
切换到Castle Windsor后,我为每个引用它的组件注册了一个名为ILogger的单例,然后使用DependsOn(...)将这些记录器分配给我的组件。代码或多或少是这样的:
// register logger implementations
container.Register(Component.For<ILogger>()
.ImplementedBy<RolexLogger>()
.Named("Component1Logger")
.UsingFactoryMethod(() => LoggerImpl.GetLogger("Component1Logger"));
container.Register(Component.For<ILogger>()
.ImplementedBy<RolexLogger>()
.Named("Component2Logger")
.UsingFactoryMethod(() => LoggerImpl.GetLogger("Component2Logger"));
// register component implementations
container.Register(Component.For<IComponent1>()
.ImplementedBy<MyComponent1>()
.DependsOn(Dependency.OnComponent(typeof(ILogger), "Component1Logger")));
container.Register(Component.For<IComponent2>()
.ImplementedBy<MyComponent2>()
.DependsOn(Dependency.OnComponent(typeof(ILogger), "Component2Logger")));
这一切似乎工作,但我想知道是否有一个更简单的方法来做到这一点?这看起来好像很多代码,随着更多的组件需要它们的记录器,这些代码将会增长和增长。
我想知道是否有可能通过LoggerImpl和Transient lifestyle注册一个ILogger的实现,然后以某种方式控制LoggerImpl的实例在每次依赖于ILogger得到解决时如何创建?
我假设我也可以在注册组件时使用Dependency.OnValue(LoggerImpl.GetLogger(“LoggerName”)),但是然后LoggerImpl实例不会在容器中注册,并且我不知道这是否可行。
任何意见,想法和建议将不胜感激。
这正是我需要的,谢谢:)所以这实际上是一个功能,我不知道。顺便说一句,只是为了让代码有效 - 你能否在Resolve方法中删除“new”关键字? –
啊确定一些错误。谢谢 –