.Net Core 依赖注入
基本使用DI1 就不多说了,相信大家多多少少都有所了解。 public interface IAnimal { void Say(); } 实现此接口 public class Cat : IAnimal { public void Say() { Console.WriteLine("喵~"); } } public class Dog : IAnimal { public void Say() { Console.WriteLine("汪~"); } } NuGet Microsoft.Extensions.DependencyInjection
这是在 .Net Core 中微软默认已经实现的DI2容器,并且使用广泛。 示例 IServiceCollection services = new ServiceCollection(); services.AddTransient<IAnimal,Dog>(); IServiceProvider provider = services.BuildServiceProvider(); var animal = provider.GetService<IAnimal>(); animal.Say(); Note
生命周期
配置文件在 .Net Core 中的配置文件一般为 appsettings.json 或者 appsettings.环境变量.json,现在我们可以将配置文件中某一个节点映射成一个模型类的实例。 配置节点 { "Cryptography": { "DesKey": "1dD%8Il4", "TripleDesKey": "OTNbgW4#qVAl7wMqdbBN$Pjd", "AesKey": "GaHleK8&qHXFG0p4vb3QB&xbUovs7&7n" } } 模型类 public sealed class CryptographyOptions { public string DesKey { get; set; } public string TripleDesKey { get; set; } public string AesKey { get; set; } } NuGet Microsoft.Extensions.Options
首先使用扩展函数注册所需的服务 services.AddOptions();
注册配置节点和模型类的注入关系 services.Configure<CryptographyOptions>(configuration.GetSection("Cryptography")); Note
示例 public sealed class Cryptography { public readonly CryptographyOptions Options; public Cryptography(IOptions<CryptographyOptions> configOption) { Options = configOption.Value; } } EntityFrameworkNuGet Microsoft.EntityFrameworkCore
可以通过 MVCNuGet Microsoft.AspNetCore.Mvc
可以通过 使用 autofac 替换注入容器在 Microsoft.Extensions.Options 所提供的注入容器中,目前我只发现了构造函数注入这种方式,但是接触过 DI3 的朋友都知道现在的注入容器多多少少都会提供一些更加高级的功能,比如 属性注入、条件注入、模块注入……等,所以我们在这里使用 autofac 来替换注入容器,实现这些高级功能。当然注入容器不止 autofac ,还有 Ninject、著名的 castleproject 中的 Windsor (Abp.Net 中就是使用的这个) 等等。 NuGet Autofac.Extensions.DependencyInjection
示例 在 .Net Core Mvc Application 中 public IServiceProvider ConfigureServices(IServiceCollection services) { services.AddMvc(); var builder = new ContainerBuilder(); //注入关系 builder.Populate(services); return new AutofacServiceProvider(builder.Build()); } Note 由于 MVC 中 Controller 的实例创建是由自己控制的,要实现高级注入功能,必须要让 Controller 的创建过程由注入容器来控制,所以修改代码为: public IServiceProvider ConfigureServices(IServiceCollection services) { services.Replace(ServiceDescriptor.Transient<IControllerActivator,ServiceBasedControllerActivator>()); services.AddMvc().AddControllersAsServices(); var builder = new ContainerBuilder(); //注入关系 builder.Populate(services); return new AutofacServiceProvider(builder.Build()); } 参考资料
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |