目录
1、DI&&IOC简单介绍
2、UML类图中六种关联关系
3、.net core 中DI的使用
4、.net core DI初始化源码初窥
DI&&IOC简单介绍
DI(依赖注入)是实现IOC(控制反转)的一种方式。面向对象设计六大基本原则的依赖倒置原则,高层类不应该依赖于低层类的实现 ,而应该依赖于它的抽象。所以我们现在工作中,经常是构造函数中,注入需要实现的类的接口;IOC描述的是当一个类需要另外一个类时,这个类的实现不应该由它来决定,实现由一个DI容器来实现,并将其注入到这个类中。
UML类图中六种关联关系
顺便复习一波UML类图中的六种关系:
.net core 中DI的使用
.NET Core框架中,默认存在一个DI容器,使用的时候我们只需要将需要将接口服务放入DI容器。 这里,我们创建一个Movie类,引用efcore 添加一个数据库链接上下文。添加一个IMovieService 接口和MovieService 类。代码如下所示
public class ApplicationDbContext:DbContext { public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) :base(options) { } public DbSet<Movie> Movie { get; set; } }
1 public class Startup 2 { 3 public IConfiguration Configuration { get; set; } 4 5 public Startup() 6 { 7 var builder = new ConfigurationBuilder() 8 .AddJsonFile("appsettings.json"); //将appsettings 配置文件读入系统配置 9 10 Configuration = builder.Build(); 11 } 12 // This method gets called by the runtime. Use this method to add services to the container. 13 // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940 14 public void ConfigureServices(IServiceCollection services) 15 { 16 services.AddDbContext<ApplicationDbContext>(options => 17 { 18 options.UseSqlServer(Configuration.GetConnectionString("MVCMovieContext")); //添加数据库链接字符串 19 }); 20 services.AddRouting(); 21 services.AddMvc(); 22 services.AddScoped<IMovieService, MovieService>();//接口服务放入DI容器 23 } 24 25 // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. 26 public void Configure(IApplicationBuilder app, IHostingEnvironment env) 27 { 28 if (env.IsDevelopment()) 29 { 30 app.UseDeveloperExceptionPage(); 31 } 32 app.UseMvc(routes => 33 { 34 routes.MapRoute( 35 name: "default", 36 template: "{controller=Home}/{action=Index}/{id?}"); 37 }); 38 } 39 }
1 public class Movie 2 { 3 public int ID { get; set; } 4 public string Title { get; set; } 5 public DateTime ReleaseDate { get; set; } 6 public string Genre { get; set; } 7 public decimal Price { get; set; } 8 }
1 public interface IMovieService 2 { 3 Movie GetMovie(int Id); 4 } 5 public class MovieService : IMovieService 6 { 7 private readonly ApplicationDbContext _applicationDbContext; 8 9 public MovieService(ApplicationDbContext applicationDbContext) 10 { 11 _applicationDbContext = applicationDbContext; 12 } 13 public Movie GetMovie(int Id) 14 { 15 var entity = _applicationDbContext.Movie.FirstOrDefault(t => t.ID == Id); 16 if (entity == null) 17 return null; 18 return entity; 19 } 20 }
1 public class HomeController : Controller 2 { 3 private readonly IMovieService _movieService; 4 public HomeController(IMovieService movieService) 5 { 6 _movieService = movieService; 7 } 8 public IActionResult Index(int Id) 9 { 10 var movie = _movieService.GetMovie(Id); 11 return View(movie); 12 } 13 }
这里我们在MovieService中,注入了数据库链接上下文实例;在HomeController 中,注入了IMovieService 。
.net core DI初始化源码初窥
在 .Net Core 框架的Main函数中,
1、WebHost 通过CreateDefaultBuilder 创建一个WebHostBuilder实例。WebHostBuilder调用 Build方法,在Build方法中,调用BuildCommonServices方法返回一个IServiceCollection。这个ServiceCollection是在BuildCommonServices方法中,实例化的一个,然后在实例化的ServiceCollection中加入一些默认的配置(例如HttpContextFactory,IHostingEnvironment)。
拿到IServiceCollection对象后,在Build方法中,对IServiceCollection IServiceCollection和IServiceCollection.ServiceProvider 进行一个初始化操作(Initialize)方法,然后返回WebHost。
2、在Initialize方法中,执行EnsureApplicationServices方法,EnsureApplicationServices中又通过调用EnsureStartup方法,在EnsureStartup中,通过WebHostProvider拿到StartUp实例。EnsureApplicationServices拿到StartUp后调用ConfigureServices方法,参数是ServiceCollection来完成DI。(这也就是我们新建一个项目StartUp 中的ConfigureServices方法,然后各种services.addxxxx(),把接口和服务放入到IserviceCollection)
Jesse博客学习笔记。传送门=》 http://video.jessetalk.cn/