2

问题

如果在创建函数中指定了无法映射到构造函数的参数,类型化工厂是否应该抛出异常?例如

public class Foo
{
    public Foo() : Foo(new Guid())
    {
    }

    // Used to be 'public Foo(string bar)'
    public Foo(Guid guid)
    {
    }
}

public interface FooFactory
{
    Foo CreateFoo(string bar);
}

我们发现部分错误是由类型化工厂静默调用默认构造函数引起的,而不是当它在 Foo 上找不到接受字符串的构造函数时抛出异常。Foo 的构造函数已更改,但在类型化工厂中创建它的方法尚未更新。

部分解决方案?

我们做了一些实验,找到了一个潜在的解决方案:

public class OurComponentSelector : DefaultTypedFactoryComponentSelector
{
    public override IDictionary GetArguments(MethodInfo method, object[] arguments)
    {
        // Check an appropriate constructor can be found, throw exception if not
    }
}

这会是一个合适的解决方法吗?

4

1 回答 1

0

是的。这正是 ITypedFactoryComponentSelector 旨在提供的可扩展性类型。

Windsor 自己的 DefaultDelegateComponentSelector 使用相同的扩展点来转换参数,然后再将它们传递给容器。

于 2012-07-16T23:34:26.597 回答