This question already has an answer here:
What is self-binding in an IoC container?

(1个答案)


4年前关闭。




什么是autofac中的AsSelf()
我是autofac的新手,AsSelf到底是什么,下面的两者有什么区别?
builder.RegisterType<SomeType>().AsSelf().As<IService>();
builder.RegisterType<SomeType>().As<IService>();

谢谢!

最佳答案

通常,您希望将接口(interface)而不是实现注入(inject)到类中。

但是,假设您有:

interface IFooService { }

class FooService { }

注册builder.RegisterType<FooService>()允许您注入(inject)FooService,但是即使IFooService实现了它,也不能注入(inject)FooService。这等效于builder.RegisterType<FooService>().AsSelf()

注册builder.RegisterType<FooService>().As<IFooService>()允许您注入(inject)IFooService,但不再注入(inject)FooService -使用上面显示的.As<T>“覆盖”默认注册“按类型”。

为了有可能同时按类型和接口(interface)注入(inject)服务,您应该在先前的注册中添加.AsSelf():builder.RegisterType<FooService>().As<IFooService>().AsSelf()

如果您的服务实现了许多接口(interface),并且您想全部注册它们,则可以使用builder.RegisterType<SomeType>().AsImplementedInterfaces()-这使您可以通过其实现的任何接口(interface)来解析服务。

您必须明确注册,因为Autofac不会自动进行注册(因为在某些情况下,您可能不想注册某些接口(interface))。

here in Autofac documentation也对此进行了描述

10-05 22:12