代码之家  ›  专栏  ›  技术社区  ›  DrArqon

Castle Windsor注册开放泛型ILogger

  •  1
  • DrArqon  · 技术社区  · 7 年前

    我有我的简单喷油器注册:

    container.RegisterConditional(typeof(ILogManager),
    c => typeof(LogManager<>).MakeGenericType(c.Consumer.ImplementationType),
    Lifestyle.Singleton,
    c => true);
    

    我试过了

    container.Register(Component.For(typeof(ILogger))
                .ImplementedBy(typeof(Log4NetLogger<>).MakeGenericType())
                .LifeStyle.Singleton.Start());
    

    无法使其工作。

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

    不幸的是,这对于Castle来说更为复杂。但使用SubDependencyResolver可以获得相同的结果:

    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)
        {
            var logger = typeof(LogManager<>).MakeGenericType(model.Implementation);
            return Activator.CreateInstance(logger);
        }
    }
    

    Kernel.Resolver.AddSubResolver(new LoggerResolver())
    

    public class OpenGenericAncestorMatchingStrategy : IGenericImplementationMatchingStrategy
    {
        public Type[] GetGenericArguments(ComponentModel model, CreationContext context)
        {
            return new[] { context.Handler.ComponentModel.Implementation };
        }
    }
    

    和注册:

    container.Register(Component.For<ILogger>().ImplementedBy(typeof(LogManager<>), new OpenGenericAncestorMatchingStrategy()));