Can Castle.Windsor TypedFactoryFacility可以构造一个只有一些内联传递参数的类型吗?

时间:2013-10-03 23:22:54

标签: c# castle-windsor factory

我在使用Castle.Windsor的TypedFactoryFacility概念时遇到了问题,并且不确定如何解决它(或者如果可以的话)。

我有一个像这样定义的ViewModel;

public class MyViewModel : IMyViewModel
{
    // constructor which I aim to access through the factory
    public MyViewModel(
        ISomeContainerResolvableDependency a,
        ISomePassedInDependency b)
    { ... }
}

并且相应的工厂界面定义为;

public interface IMyViewModelFactory 
{
    IMyViewModel Create(ISomePassedInDependency a);

    void Release(IMyViewModel vm);
}

但是,当我尝试使用ISomePassedInDependency的有效非空实例调用工厂时,

ISomePassedInDependency o = new SomePassedInDependency();
IMyViewModelFactory factory = IoC.Get<IMyViewModelFactory>();
IMyViewModel viewModel = factory.Create(o);

我得到一个异常,指出Castle Windsor无法解决IMyViewModel ISomePassedInDependency上的依赖关系。在这种情况下,我正在提供ISomePassedInDependency实例,并且只希望设施为我解析ISomeContainerResolvableDependency

如果我更改构造函数定义以接受我传入的值类型(例如int)而不是ISomePassedInDependency实例,则工厂调用有效。因此,似乎Castle Windsor内部假设所有引用类型都将被容器解析而其他任何东西都不会被解析?

有没有办法让这项工作?

1 个答案:

答案 0 :(得分:5)

好的,我重新阅读documentation并注意到我忽略了一个关键信息;工厂中的参数名称必须匹配正在实例化的对象中的参数名称。

因此,在上面的示例中,如果ViewModel的构造函数更改为;

public MyViewModel(
    ISomeContainerResolvableDependency x,
    ISomePassedInDependency a) // <-- NOTE this argument is now named 'a' to match the factory definition
{ ... }    

有效。

魔术。