一、定製第三方依賴注入容器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的所有工作
項目結構圖