我目前正在尝试将一个工作项目从纯DI切换到Castle。我有几个组件,它们具有ILogger类型的属性依赖关系。我的LoggerImpl是通过以下静态工厂方法创建的:
LoggerImpl.GetLogger("LoggerName");
当前具有ILogger依赖关系(纯DI)的每个组件在构建对象树时都会收到一个命名记录器,例如:
var component1 = new MyComponent1(dependencies...);
component.Logger = LoggerImpl.GetLogger("Component1Logger");
var component2 = new MyComponent2(dependencies...);
component.Logger = LoggerImpl.GetLogger("Component2Logger");
切换到温莎城堡后,我为引用它的每个组件注册了一个命名的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的实现,然后以某种方式控制每次解决对ILogger的依赖时如何创建LoggerImpl实例?
我想我也可以使用依赖关系。在注册组件时使用OnValue(LoggerImpl.GetLogger(“LoggerName”)),但是LoggerImpl实例不会在容器中注册,我不知道这是否正确。
如有任何意见、想法和建议,我们将不胜感激。