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

RJ *_*han 3 c# factory castle-windsor

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

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

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

并且定义了相应的工厂接口;

public interface IMyViewModelFactory 
{
    IMyViewModel Create(ISomePassedInDependency a);

    void Release(IMyViewModel vm);
}
Run Code Online (Sandbox Code Playgroud)

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

ISomePassedInDependency o = new SomePassedInDependency();
IMyViewModelFactory factory = IoC.Get<IMyViewModelFactory>();
IMyViewModel viewModel = factory.Create(o);
Run Code Online (Sandbox Code Playgroud)

我得到一个异常,指出温莎城堡无法从解决的依赖IMyViewModelISomePassedInDependency.在这种情况下,我正在提供ISomePassedInDependency实例,只希望设施ISomeContainerResolvableDependency为我解决.

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

有没有办法使这项工作?

RJ *_*han 5

好的,我重新阅读文档并注意到我忽略了一些关键信息; 工厂的参数名称必须与要实例化的对象的参数名称匹配.

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

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

有用.

魔法.