ASP.NET Core 2.2--第三方依賴注入容器Autofact替換內置IServiceCollection容器

一、定製第三方依賴注入容器Autofac

1、nuget引入autofac和 Autofac.Extensions.DependencyInjection

2、註釋掉原來的IServiceCollection,ConfigureServices需要返回值IServiceProvider

3、new ContainerBuilder實例化容器

4、註冊服務

  a、使用containerBuilder.RegisterType註冊服務

  b、使用containerBuilder.RegisterModule註冊服務,通過Module註冊

5、返回AutofacServiceProvider 的實例

     #region 原來的IServiceCollection容器
        // This method gets called by the runtime. Use this method to add services to the container.
        //public void ConfigureServices(IServiceCollection services)
        //{
        //    services.Configure<CookiePolicyOptions>(options =>
        //    {
        //        // This lambda determines whether user consent for non-essential cookies is needed for a given request.
        //        options.CheckConsentNeeded = context => true;
        //        options.MinimumSameSitePolicy = SameSiteMode.None;
        //    });//    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
        //}
        #endregion

        /// <summary>
        /// 整合Autofac
        /// 1、引入autofac Autofac.Extensions.DependencyInjection
        /// 2、ConfigureServices需要返返回值 IServiceProvider
        /// 3、實例化容器
        /// 4、註冊服務
        /// 5、返回AutofacServiceProvider的實例
        /// </summary>
        /// <param name="services"></param>
        public IServiceProvider ConfigureServices(IServiceCollection services)
        {
            services.Configure<CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
            //1、實例一個容器
            ContainerBuilder containerBuilder = new ContainerBuilder();

            //services默認的註冊服務,還需要處理控制器實例相關的的工作。 
            containerBuilder.Populate(services); //autofac全權接管了之前這個Service的所有工作

            //2、註冊服務
            containerBuilder.Register(a => new CustomAutofacAOP()); //autofac允許使用Aop
            //a、使用containerBuilder.RegisterType註冊服務
            containerBuilder.RegisterType<ApplePhoneService>().As<IPhone>().SingleInstance();
            //b、使用containerBuilder.RegisterModule註冊服務,通過Module註冊
            containerBuilder.RegisterModule<CustomAutofacModule>();
            IContainer container = containerBuilder.Build();

            return new AutofacServiceProvider(container);
        }

 註冊服務

namespace Self.David.Core.Service.Utility
{
    public class CustomAutofacModule : Module
    {
        /// <summary>
        ///  當前這Module專用做服務註冊
        /// </summary>
        /// <param name="builder"></param>
        protected override void Load(ContainerBuilder builder)
        {
            builder.RegisterType<DogService>().As<IAnimal>().SingleInstance();
            builder.RegisterType<SmsMsgService>().As<IMsg>().SingleInstance();
        }
    }
}

 接口

namespace Self.David.Core.Interface
{
    public interface IAnimal
    {
        void Running();
    }
}
namespace Self.David.Core.Interface
{
    public interface IMsg
    {
        void SendMsg();
    }
}
namespace Self.David.Core.Interface
{
    public interface IPhone
    {
        void Call();
    }
}

服務

namespace Self.David.Core.Service
{
public class ApplePhoneService : IPhone { public void Call() { Console.WriteLine($"{nameof(ApplePhoneService)}打電話!"); } } } namespace Self.David.Core.Service { public class DogService : IAnimal { public void Running() { Console.WriteLine($"{nameof(DogService)}奔跑!"); } } } namespace Self.David.Core.Service { public class SmsMsgService : IMsg { public void SendMsg() { Console.WriteLine($"{nameof(SmsMsgService)}發送消息!"); } } }

控制器

namespace Self.David.Core.MVC6.Controllers
{
    /// <summary>
    /// 在服務中實現AOP
    /// Autofacr容器替換IServiceCollection容器
    /// </summary>
    public class AutofacDIController : Controller
    {
        private IPhone _iPhone = null;
       
        public AutofacDIController(IPhone iPhone)
        {
            _iPhone = iPhone;
        }

        public IActionResult Index()
        {
            _iPhone.Call();
            return View();
        }
    }
}

 

    /// <summary>
    /// Autofacr容器替換IServiceCollection容器
    /// </summary>
    public class AutofacDIModuleController : Controller
    {
        private IAnimal _iAnimal = null;
        private IMsg _iMsg = null;

        public AutofacDIModuleController(IAnimal iAnimal, IMsg iMsg)
        {
            _iAnimal = iAnimal;
            _iMsg = iMsg;
        }

        public IActionResult Index()
        {
            _iAnimal.Running();//動物奔跑
            _iMsg.SendMsg();//發送消息
            return View();
        }
    }

開始在ConfigureServices裏註冊ApplePhoneService,當我們訪問AutofacDIController,構造AutofacDIController的時候注入了ApplePhoneService,如下圖所示

 

開始在ConfigureServices裏通過Module方式註冊DogService和SmsService,當我們訪問AutofacDIModuleController,構造AutofacDIModuleController的時候注入了DogService和SmsService,如下圖所示

 

二、第三方容器Autofac和內置的容器IServiceCollection衝突嗎?
不會衝突,autofac全權接管了之前IServiceCollection的所有工作

 

項目結構圖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章