.net core 雜記:用Autofac替換內置容器


官方建議使用內置容器,但有些功能並不支持,如下:
  • 屬性注入
  • 基於名稱的注入
  • 子容器
  • 自定義生存期管理
  • 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.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM