我正在使用 Autofac 构造函数注入。我需要弄清楚如何将单个对象实例注入多个构造函数参数,而无需在容器设置阶段显式解析每个参数。
我有一个复杂的场景,可以通过这种行为来简化;以下示例只是一个简化的场景,因此我可以演示我正在寻找的行为。
例子:
假设我有这两个接口,IOpenable 和 ICloseable:
public interface IOpenable
{
void Open();
}
public interface ICloseable
{
void Close();
}
我有一个实现它们的 Door 类:
public interface IDoor : IOpenable, ICloseable { }
public class Door : IDoor, IOpenable, ICloseable
{
void Open() { ... }
void Close() { ... }
}
我有一个接受 IOpenable 和 ICloseable 的类:
public class DoorHandler : IDoorHandler
{
public DoorHandler(IOpenable openable, ICloseable closeable)
{
...
}
...
}
问题:
每当 IOpenable 和 ICloseable 都是同一个构造函数中的依赖项时, 是否可以告诉 autofac 将相同的 Door 对象注入到两个参数中?
注意:我不能这样做:
container.Register<IDoorHandler>( c => {
Door d = c.Resolve<IDoor>();
return new DoorHandler(d,d)
});
那会做我想做的,但请记住这个 DoorHandler 类只是一个例子。在我的真实代码中,“DoorHandler”实际上是一个 MVC 控制器,我正在使用 RegisterControllers() 注册它。所以我不能像上面那样注册它。此外,有时依赖图可能会变得过于复杂,并且在每种情况下都明确地执行此操作会变得不堪重负。
我想我正在寻找的是能够做类似的事情:
container.RegisterType<DoorHandler>().As<IDoorHandler>();
container.RegisterType<Door>().As<IDoor>();
container.Register<IOpenable>( c => c.ResolveShared<IDoor>(); );
container.Register<ICloseable>( c => c.ResolveShared<IDoor>(); );
c.ResolveShared<T>
如果在同一个构造函数中调用多个参数,where 调用将全部解析为同一个 T 对象。
也许:
container.RegisterType<DoorHandler>().As<IDoorHandler>();
container.RegisterType<Door>().As<IDoor>().InstancePerDependencyShared();
container.Register<IOpenable>( c => c.Resolve<IDoor>(); );
container.Register<ICloseable>( c => c.Resolve<IDoor>(); );
显然,如果我对 Door 对象使用 InstancePerLifetimeScope 或其他东西,每个已解析的 Door 都将是同一个实例。但我不希望这样,每次创建 DoorHandler 时我都想要一个 Door 的新实例,并且我希望将该 Door 作为两个参数传递给 DoorHandler 构造函数。