我如何注册我的组件(带构造函数参数),这样当我试图解决它时就不会抛出异常
本文关键字:抛出异常 解决 注册 何注册 我的 组件 参数 构造函数 | 更新日期: 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++;
}
}
我只是用通用方法注册了组件,为了能够做到这一点,我按数字键命名了它们中的每一个。我测试了这个。