1. 程式人生 > >用Autofac替換.net core 內建容器

用Autofac替換.net core 內建容器

官方建議使用內建容器,但有些功能並不支援,如下:
  • 屬性注入
  • 基於名稱的注入
  • 子容器
  • 自定義生存期管理
  • Func<T> 支援

所以可以使用其他第三方IOC容器,如Autofac,下面為學習使用記錄

一、首先準備了一個介面和其實現類

public interface ITestService
{
    string ShowMsg();
}

 

public class TestService: ITestService
{
    public string ShowMsg()
    {
        return "test123";
    }
}

 

二、安裝Nuget 包

Autofac
Autofac.Extensions.DependencyInjection

 

三、在 Startup.ConfigureServices 中配置容器

注:使用第三方容器,Startup.ConfigureServices 必須返回 IServiceProvider。

  第一種方式,使用AutofacModule配置檔案,原來程式碼修改為:

public IServiceProvider ConfigureServices(IServiceCollection services)
{
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    // Add Autofac
    var containerBuilder = new ContainerBuilder();
    containerBuilder.RegisterModule<AutofacModule>();
    containerBuilder.Populate(services);
    var container = containerBuilder.Build();
    return new AutofacServiceProvider(container);
}

AutofacModule類如:

public class AutofacModule: Module
{
    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterType<TestService>().As<ITestService>();
     //........... } }

 

  第二種方式

Startup.ConfigureServices如下修改

public IServiceProvider ConfigureServices(IServiceCollection services)
{
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    // Add Autofac
    var containerBuilder = new ContainerBuilder();
    //containerBuilder.RegisterModule<AutofacModule>();

   //自動註冊該程式集下的所有介面 //netcore_autofac 為程式集名稱空間 //InstancePerLifetimeScope:同一個Lifetime生成的物件是同一個例項 //SingleInstance:單例模式,每次呼叫,都會使用同一個例項化的物件;每次都用同一個物件; //InstancePerDependency:預設模式,每次呼叫,都會重新例項化物件;每次請求都建立一個新的物件; containerBuilder.RegisterAssemblyTypes(Assembly.Load("netcore_autofac")).AsImplementedInterfaces().InstancePerLifetimeScope(); containerBuilder.Populate(services); var container = containerBuilder.Build(); return new AutofacServiceProvider(container); }

 

其他Autofac在.net core 的使用,請參考官方文件:https://docs.autofac.org/en/latest/integration/aspnetcore.