我如何注册我的组件(带构造函数参数),这样当我试图解决它时就不会抛出异常

本文关键字:抛出异常 解决 注册 何注册 我的 组件 参数 构造函数 | 更新日期: 2023-09-27 18:17:00

我有以下情况:

public interface IFormater
    {
        StyleInformation GetStyleInformation(Fact fact);
        FactType[] Formats { get; }
    }
public const string STYLENAME = "ABZ Date Style";
        ILocalization localization;
        public DateFormater(ILocalization localization)
        {
            this.localization = localization;
        }
        public StyleInformation GetStyleInformation(Fact fact)
        {
            return new StyleInformation(STYLENAME, false, false, false, false, false, true, localization.DateFormat);
        }
        public FactType[] Formats
        {
            get { return new FactType[] { FactType.Date }; }
        }
public class FormattingFacade
    {
        List<IFormater> formatters;
        IWindsorContainer container;
        public FormattingFacade(IWindsorContainer container)
        {
            this.container = container;
            formatters = new List<IFormater>();
            var formaterInterface = typeof(IFormater);
            foreach (Type type in this.GetType().Assembly.GetTypes())
            {
                if (formaterInterface.IsAssignableFrom(type) && !type.Equals(formaterInterface))
                {
                    container.Register(Component.For(new Castle.Core.ComponentModel(type.FullName, type, type)));
                    formatters.Add((IFormater)container.Resolve(type));
                }
            }
        }
        public StyleInformation GetStyleInformation(Fact fact)
        {
            foreach (IFormater formater in formatters)
                if (formater.Formats.Contains(fact.Concept.XbrlBaseType)) return formater.GetStyleInformation(fact);
            throw new NoFormaterException();
        }
    }

问题是,当试图解析在构造函数中有一些参数的格式化器时,castle会抛出异常。如果有没有参数构造函数的格式化器,它就可以工作。我应该如何注册以及如何解析这些类型,但要保持这种灵活性

我如何注册我的组件(带构造函数参数),这样当我试图解决它时就不会抛出异常

如果你希望Windsor能够解析组件,那么Windsor需要知道如何解析匹配构造函数的每个参数。您要么需要确保所有依赖项都在Windsor中注册,要么创建一个子依赖项解析器来处理其他情况(所需的参数没有在Windsor中注册)。

我是这样解决的:

int i = 0;
foreach (Type type in this.GetType().Assembly.GetTypes())
{
        if (formaterInterface.IsAssignableFrom(type) && !type.Equals(formaterInterface))
        {
                container.Register(Component.For<IFormater().ImplementedBy(type).Named(i.ToString()));
                formatters.Add(container.Resolve<IFormater>(i.ToString()));
                i++;
        }
}

我只是用通用方法注册了组件,为了能够做到这一点,我按数字键命名了它们中的每一个。我测试了这个。