.Net Core自带的 IOC


自带的 IOC会提供3种生命周期当我们,只支持.NET CORE


1、Transient(瞬时的)  

推荐用法 

 每次请求时都会创建的瞬时生命周期服务。这个生命周期最适合轻量级,无状态的服务。

 services.AddTransient<ITestService, TestService>();//这种每次使用会是新的生命周期



2、Scoped(作用域的)

推荐用法 

在同作用域,服务每个请求只创建一次。 

services.AddScoped<ITestService2, TestService2>();



3、Singleton(静态的)

不推荐

 一但设置成了Singleton,你的代码就需要注意了

 services.AddSingleton<ITestService3, TestService3>();

错误用法 (该代码只有在Singleton模式下才会有问题)

public class TestService3:DbContext
{
    
}
public class DbContext
{
   public SqlSugarClient Db;//这个时候因为TestService3给静态变相的Db也变成静态的了
   public DbContext(){
      Db=new SqlSugarClient(....);
   }
}

如果你非要用 Singleton模式你的代码就需要用出调整

调整代码如下:

public class DbContext
{
   public SqlSugarClient Db 
   get{
      
      return new SqlSugarClient(...);//每调用Db都会new一个新的SqlSugarClient
   }
   
}

//如果要用到事务不能每次都new
var db=Db;
db.xxx;
db.xxxx; //这样在一个方法都可以用一个db对象不会new





.NET Core 3.X MVC 使用自带的IOC

如果没用过自带IOC的我们从零开始学起


1、创建MVC项目

默认MVC是不支持路由的,需要在Startup.cs里面加入

  app.UseEndpoints(endpoints =>
  {
     endpoints.MapControllerRoute
     (name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");
     endpoints.MapControllerRoute
     ("areaRoute", "{area:exists}/{controller=Admin}/{action=Index}/{id?}");
  });

然后删除自带的Pages

在根目录创建Controllers文件夹和Views文件夹


2、配置IOC

public void ConfigureServices(IServiceCollection services)
{
            services.AddRazorPages();
    
            services.AddScoped<OrderDal>();//添加这2行
            services.AddDirectoryBrowser();//添加这2行
}


3、控制器里面使用注入

 public class HomeController : Controller
 {
        public OrderDal order { get; set; }

        public HomeController(OrderDal order) 
        {
            this.order = order;
        }
        public IActionResult Index()
        {
            var list = order.GetList();
            return View();
        }
 }

BLL层定义一个类

 public class OrderDal : Repository<Order>
 {
 
 }
 //如果不会定义Repository<Order> 
 //查看文档仓储定义 http://www.codeisbug.com/Home/Doc?typeId=1228