代码之家  ›  专栏  ›  技术社区  ›  Marcin Pawlica

Castle Windsor-瞬态组件的控制创建

  •  2
  • Marcin Pawlica  · 技术社区  · 8 年前

    我目前正在尝试将一个工作项目从纯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实例不会在容器中注册,我不知道这是否正确。

    如有任何意见、想法和建议,我们将不胜感激。

    1 回复  |  直到 8 年前
        1
  •  2
  •   Jan Muncinsky    8 年前

    您可以使用子解析器

    public class LoggerResolver : ISubDependencyResolver
    {
        public bool CanResolve(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model, DependencyModel dependency)
        {
            return dependency.TargetType == typeof(ILogger);
        }
    
        public object Resolve(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model, DependencyModel dependency)
        {
            return LoggerImpl.GetLogger(model.Implementation.FullName);
        }
    }
    

    而不是在任何注册之前将其添加到内核中

    container.Kernel.Resolver.AddSubResolver(new LoggerResolver())
    
    推荐文章