【问题标题】:castle windsor ITypedFactoryComponentSelectors constructor parameter by type not name城堡温莎 ITypedFactoryComponentSelectors 构造函数参数按类型而不是名称
【发布时间】:2014-04-08 09:42:08
【问题描述】:

我正在使用一个外部库,我无法控制对象构造函数的命名约定。有多种构造函数,它们根据参数类型进行区分。因此,我想覆盖类型化工厂中的约定,以通过参数的确切名称检索并使用类型。

例如

GenderTemplateViewModel CreateGenderTemplateViewModel();
GenderTemplateViewModel CreateGenderTemplateViewModel(GenderTemplateModel     genderTemplateModel); 
GenderTemplateViewModel CreateGenderTemplateViewModel(GenderTemplateModel     genderTemplateModel, string extraInfo); 

因此我可以通过类型而不是参数名称来获取正确的构造函数吗? 即覆盖哪个方法以及如何覆盖

public class ParameterbyTypeNotNameTypedFactoryComponentSelector :    DefaultTypedFactoryComponentSelector
{
    protected override Type GetComponentType(MethodInfo method, object[] arguments)
    {

        return base.GetComponentType(method, arguments);
    }
    protected override string GetComponentName(MethodInfo method, object[] arguments)
    {

        return base.GetComponentName(method, arguments);
    }
    protected override IDictionary GetArguments(MethodInfo method, object[] arguments)
    {

        return base.GetArguments(method, arguments);
    }
}

【问题讨论】:

    标签: c# castle-windsor factory


    【解决方案1】:

    您需要 GetArguments() 方法。以下应该有效:

    public class ExtendedTypedFactoryComponentSelector : DefaultTypedFactoryComponentSelector
    {
        protected override IDictionary GetArguments(MethodInfo method, object[] arguments)
        {
            if (arguments == null)
            {
                return null;
            }
    
            ParameterInfo[] parameters = method.GetParameters();
            Arguments arg = new Arguments(new IArgumentsComparer[0]);
            for (int i = 0; i < parameters.Length; i++)
            {
                if (arg.Contains(parameters[i].ParameterType))
                {
                    if (this.isFunc(method.DeclaringType))
                    {
                        throw new ArgumentException(string.Format("Factory delegate {0} has duplicated arguments of type {1}. Using generic purpose delegates with duplicated argument types is unsupported, because then it is not possible to match arguments properly. Use some custom delegate with meaningful argument names or interface based factory instead.", method.DeclaringType, parameters[i].ParameterType));
                    }
                }
                else
                {
                    arg.Add(parameters[i].ParameterType, arguments[i]);
                }
                arg.Add(parameters[i].Name, arguments[i]);
            }
            return arg;
        }
    
        private bool isFunc(Type type)
        {
            return ((type.FullName != null) && type.FullName.StartsWith("System.Func"));
        }
    }
    

    注意:这只是 DefaultTypedFactoryComponentSelector 原始实现的一个稍微不同的版本。

    希望这会有所帮助。

    【讨论】:

    • 谢谢,这似乎可以很好地解决问题。我意识到这将是一个相对较小的更改,但问题是知道要覆盖哪种方法。再次感谢。
    • 注:目前所有的构造函数都有一个参数,其余的由工厂注入,所以没有抛出异常,也没有测试那个部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多