Castle.Windsor TypedFactoryFacility是否可以构造一个类型,只有一些内联传递的引用参数

本文关键字:引用 参数 类型 一个 是否 TypedFactoryFacility Windsor Castle | 更新日期: 2023-09-27 18:33:45

我在使用Castle.Windsor的TypedFactoryFacility概念时遇到了一个问题,不知道如何解决它(或者我是否可以)。

我有一个这样定义的视图模型;

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);

我得到一个例外,指出温莎城堡无法解决IMyViewModelISomePassedInDependency的依赖关系。在这种情况下,我提供ISomePassedInDependency实例,并且只希望该工具为我解析ISomeContainerResolvableDependency

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

有没有办法做到这一点?

Castle.Windsor TypedFactoryFacility是否可以构造一个类型,只有一些内联传递的引用参数

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

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

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

它有效。

魔法。