我使用的是ASP.NET Core及其内置容器。我想将我的注册迁移到Autofac。
Autifac docs没有"迁移指南",所以我想确保我正确地做事。
ASP.NET Core container -> Autofac
---------------------- -------
// the 3 big ones
services.AddSingleton<IFoo, Foo>() -> builder.RegisterType<Foo>().As<IFoo>().SingleInstance()
services.AddScoped<IFoo, Foo>() -> builder.RegisterType<Foo>().As<IFoo>().InstancePerLifetimeScope()
services.AddTransient<IFoo, Foo>() -> builder.RegisterType<Foo>().As<IFoo>().InstancePerDependency()
// default
services.AddTransient<IFoo, Foo>() -> builder.RegisterType<Foo>().As<IFoo>()
// multiple
services.AddX<IFoo1, Foo>();
services.AddX<IFoo2, Foo>(); -> builder.RegisterType<Foo>().As<IFoo1>().As<IFoo2>().X()
// without interface
services.AddX<Foo>() -> builder.RegisterType<Foo>().AsSelf().X()
还有更多变体(例如代表,IEnumerable<>
),但这些是主要变体。
这是对的吗?我在某处遗漏了一些细微差别,因为Autofac非常复杂。
更新
到目前为止的评论是&#34;但为什么&#34;多样性,但这并不重要(尽管我已经在其中一些评论中解释了我们的推理)。这是一个合理的问题。 如果您有两个容器的使用经验,我非常感谢您的意见。
(作为这些解释的简短总结 - 在我们多年的经验中,我们已经了解了提供两种方法来做同样事情的艰难方法从来都不是一个好主意,因为它增加了失败的可能性因此,选择一种方式并坚持下去。一年后,一些初级开发者会因为他对替代方案感到困惑而放松一些。)
答案 0 :(得分:2)
您应该使用.AddXxx
中的Microsoft.Extensions.DependencyInjection
方法进行注册,然后将IServiceCollection
传递给autofac。
这使得更容易在容器之间进行更改。
当然,如果您需要Autofac /第三方IoC容器的某些功能(自动发现等),那么您需要使用容器本机方法。
private readonly IContainer container;
public IServiceProvider ConfigureServices(IServiceCollection services)
{
// your normal registrations
services.AddSingleton<IMySingleton,MySingleton>();
var builder = new ContainerBuilder();
builder.Populate(services);
// build container
container = builder.Build();
// and return it
return new AutofacServiceProvider(container);
}