C# 使用.AsFactory()确定运行时类型

C# 使用.AsFactory()确定运行时类型,c#,castle-windsor,C#,Castle Windsor,读完这里的问题;试图按照中提供的说明进行操作时,我肯定在某个地方丢失了一个链接 总结一下我正在尝试做的事情: 我有一个工厂的接口: public interface IFacilityTypeDescriptionBuilderFactory { IFacilityTypeDescriptionBuilder CreateFacilityTypeDescriptionBuilder(Facility facility); } 本工厂的目的是:;根据所提供设施的特定业务规则和属性值,将返

读完这里的问题;试图按照中提供的说明进行操作时,我肯定在某个地方丢失了一个链接

总结一下我正在尝试做的事情:

我有一个工厂的接口:

public interface IFacilityTypeDescriptionBuilderFactory
{
    IFacilityTypeDescriptionBuilder CreateFacilityTypeDescriptionBuilder(Facility facility);
}
本工厂的目的是:;根据所提供设施的特定业务规则和属性值,将返回不同的类型。它的类型显然是IFacilityTypeDescriptionBuilder,但具体类型将由工厂确定(但不是由工厂实例化)

最直接的实现是注册IFacilityTypeDescriptionBuilderFactory服务do.ImplementedBy,然后让工厂实例化返回的对象。但是在这样做的时候,我将被迫使用/引用/依赖于服务定位器,所以我宁愿不这样做

根据上面的帖子;我应该能够通过使用ITypedFactoryComponentSelector来实现我想要做的事情,并指导温莎做什么。不需要IFacilityTypeDescriptionBuilderFactory的具体实现

以下是我目前的工作:

        args.Container.AddFacility<TypedFactoryFacility>();

        args.Container.Register(
            Component.For<IFacilityTypeDescriptionBuilderFactory>()
                     .AsFactory()
            );

        args.Container.Register(
            Component.For<ITypedFactoryComponentSelector>()
                     .ImplementedBy<FacilityTypeDescriptionBuilderComponentSelector>()
            );
所有这些都准备好了,我现在试图断言一切都是正确连接的。事实并非如此;在本例中,“b”最终为NULL

        var f = new Facility();
        f.FacilityTypeId = 1;
        var b = args.Container.Resolve<IFacilityTypeDescriptionBuilderFactory>().CreateFacilityTypeDescriptionBuilder(f);
        Assert.IsNotNull(b as RestaurantFacilityTypeDescriptionBuilder, "b");
var f=new Facility();
f、 FacilityTypeId=1;
var b=args.Container.Resolve().CreateFacilityTypeDescriptionBuilder(f);
IsNotNull(b作为RestaurantFacilityTypeDescriptionBuilder,“b”);
据我所知,ComponentSelector从未被调用——或者至少没有以我期望的方式被调用。我得到的错误是:

找不到支持服务XYZ.Common.Builders.IFacilityTypeDescriptionBuilder的组件

因此,Windsor基本上意识到它必须从.CreateFacilityTypeDescriptionBuilder(f)方法调用返回IFacilityTypeDescriptionBuilder-它只是不知道如何返回

谁能告诉我,我在这里遗漏了什么

你需要

.AsFactory(f => f.SelectedWith<FacilityTypeDescriptionBuilderComponentSelector>())
.AsFactory(f=>f.SelectedWith())

非常感谢,确实如此。所以现在它起作用了;但我在这方面的理解还有一点差距。为什么我需要指示Windsor它的TypedFactoryComponentSelector是由FacilityTypeDescriptionBuilderComponentSelector实现的?我还指示工厂如何解决这个问题?昨天,为了让这项工作顺利进行,我试着去掉了这一步——但这两个步骤都是必需的——看起来……?:-)
.AsFactory(f => f.SelectedWith<FacilityTypeDescriptionBuilderComponentSelector>())