使用 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
的默认实现,请最后注册。
这是我的代码示例:
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
的默认实现,请最后注册。