使用 Autofac 解决拥有范围内的组件时遇到问题

Having trouble resolving components in owned scope with Autofac

这是我的代码示例:

class Item
{
    public Item(IFoo foo)
    {
        // Expected useful foo but got fake foo
    }
}

interface IFoo
{
}

class FakeFoo : IFoo
{
}

class UsefulFoo : IFoo
{
    Func<Item> _itemFactory;

    public UsefulFoo(Func<Item> itemFactory)
    {
        _itemFactory = itemFactory;
    }

    public void Initialize()
    {
        _itemFactory();
    }
}

class Program
{
    static void Main(string[] args)
    {
        var builder = new ContainerBuilder();
        builder.RegisterType<Item>().AsSelf();

        builder.RegisterType<UsefulFoo>().As<IFoo>().AsSelf().InstancePerLifetimeScope()
            .OnActivated( x => x.Instance.Initialize());
        builder.RegisterType<FakeFoo>().As<IFoo>().SingleInstance();

        var container = builder.Build();
        // Fake foo
        var fakeFoo = container.Resolve<IFoo>();
        // Owned<usefulfoo>
        var scoped = container.Resolve<Owned<UsefulFoo>>();
    }
}

我希望在 Owned<UsefulFoo> 范围内解析的 Func<Item> 会将 UsefulFoo 放入 Item 构造函数(因为它拥有范围,不是吗?)。 但实际上在 Item 构造函数中我有 FakeFoo。为什么?

我想要实现的是有两个 IFoo 实现:FakeFoo 用于全局范围,UsefulFoo 用于自有范围。

对于 Autofac,规则是 "last one in wins."

如果您注册了多个公开服务的组件,您注册的最后一个组件将被解析。在这种情况下,您在 UsefulFoo 之后注册 FakeFoo 。当您解析 Owned<T> 对象时,您专门解析了一个 UsefulFoo - 但是当您解析 Item 时,它需要一个 IFoo... 最后一个 IFoo 注册的实现是 FakeFoo.

如果您需要 UsefulFoo 作为 IFoo 的默认实现,请最后注册。