(4) Mvc Core IOC

  • asp.net mvc core 内置了 IOC 容器,不再需要 autofac 等,当然 autofac 也是支持.net core
    的(http://www.open-open.com/lib/view/open1454127071933.html)。内置 IOC 是通过构
    造函数注入,而不是属性注入.

  • 内置的 IOC 有三种生命周期:
    Transient: Transient 服务在每次被请求时都会被创建。这种生命周期比较适用于轻量级的
    无状态服务。
    Scoped: Scoped 生命周期的服务是每次 web 请求被创建。
    Singleton: Singleton 生命能够周期服务在第一被请求时创建,在后续的每个请求都会使用
    同一个实例。如果你的应用需要单例服务,推荐的做法是交给服务容器来负责单例的创建和
    生命周期管理,而不是自己来走这些事情。

  • 使用方法:服务注册是在Startup类的ConfigureServices方法你进行注册的。下面举例说明:
public   interface IUserService
    {
        string GetStr();
    }

 public class UserService : IUserService
    {
        public string GetStr()
        {
            return "hello";
        }
    }

 加入我们要以Singleton的方式让IOC容器替我们创建UserService对象,则我们只需要在Startup类的ConfigureServices方法里面调用services.AddSingleton方法

   public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();
            services.AddSingleton(typeof(IUserService), typeof(UserService));//最好 services.AddSingleton(typeof(IMyService),typeof(MyService));
因为这样的话可以在 MyService 中通过构造函数注入其他服务 }

  这样以后,Controller里我们使用UserService这个类的时候,就不需要自己New创建,而是需要的时候有IOC容器帮我们创建。

  public class HomeController : Controller
    {
        private IUserService userService;
        public HomeController(IUserService _userService)
        {
            userService = _userService;
        }
        public IActionResult Index()
        {
            string connStr = userService.GetStr();
            //return View();
            return Content(connStr);
        }
    }

 实际项目中,我们会写许多的接口,这个时候可以通过放射的方式注入服务接口

var serviceAsm = Assembly.Load(new AssemblyName("CoreProj.Service"));
foreach(Type serviceType in serviceAsm.GetTypes()
.Where(t=>typeof(IServiceTag).IsAssignableFrom(t)&&!t.GetTypeInfo().IsAbstract))
{
var interfaceTypes = serviceType.GetInterfaces();
foreach(var interfaceType in interfaceTypes)
{
services.AddSingleton(interfaceType, serviceType);
}
}
  •  其他类中的注入(例如过滤器Filter中)

确保ExceptionFilter 不是 new 出来的,而是 IOC 创建出来即可。 

  public void ConfigureServices(IServiceCollection services)
        {

            var serviceAsm = Assembly.Load(new AssemblyName("CoreProj.ServiceImpl"));
            foreach (Type serviceType in serviceAsm.GetTypes()
            .Where(t => typeof(IServiceSupport).IsAssignableFrom(t) && !t.GetTypeInfo().IsAbstract))
            {
                var interfaceTypes = serviceType.GetInterfaces();
                foreach (var interfaceType in interfaceTypes)
                {
                    services.AddSingleton(interfaceType, serviceType);
                }
            }
            services.AddSingleton(typeof(MyExceptionFilter));//放在AddMVC前面,首先在IOC中注册MyExceptionFilter


     //mvc core中注册filter要在AddMvc的回调方法中注册。
            //services.AddMvc(mvcOptions =>
            //{
            //    var serviceProvider = services.BuildServiceProvider();
            //    var exceptionFilter = serviceProvider.GetService<MyExceptionFilter>();//手动获得
            //    mvcOptions.Filters.Add(exceptionFilter);
            //});//两种写法都可以
            services.AddMvc(mvcOptions =>
            {
                mvcOptions.Filters.Add(typeof(MyExceptionFilter));
            });
  •  手动获取对象 

1.通过serviceProvider.GetService<IUserService>()获取(可以将serviceProvider写成static)

2.HttpContext 可用的时候,也可以通过这种方法来解析服务: IPostService ps =

        (IPostService)this.HttpContext.RequestServices.GetService(typeof(IPostService));

 

  • MVC Core内置的注入其他服务(https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection)

例如: ILogger,IHostingEnvironment服务等

IHostingEnvironment主要成员:

WebRootPath 属性(wwwroot 文件 夹 的 物 理 路 径 )(MVC Core中没有Server.MapPath方法)

 ContentRootPath 属 性 ( 网 站 根 目 录 的 物 理 路 径 )

 

Microsoft.AspNetCore.Hosting 下的 HostingEnvironmentExtensions 下还提供了一些扩展方法:

IsDevelopment()是否是开发环境

IsProduction()是否是生产环境

  public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                 .UseEnvironment("Production")//Development//此处设置当前运行环境(可以写到配置文件中)
                .Build();
    }

  

转载于:https://www.cnblogs.com/lyfingchow/p/7536964.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring MVC使用反射机制来实现请求的处理和方法的调用。在Spring MVC中,使用注解来标记控制器类和处理请求的方法。通过利用反射,Spring MVC能够在运行时动态地获取控制器类和方法的相关信息,并根据请求的URL来确定要调用的方法。 当一个请求到达Spring MVC应用程序时,Spring MVC会解析请求的URL,并根据URL中的路径信息找到对应的控制器类和方法。通过反射,Spring MVC可以获取到这个控制器类的实例,并调用对应的方法来处理请求。在调用方法之前,Spring MVC还可以根据方法上的注解来进行一些预处理工作,比如参数绑定和验证等。 反射机制使得Spring MVC能够灵活地处理各种不同的请求,并动态地调用对应的方法。这种方式使得开发者能够更加方便地编写和维护控制器类,同时也提高了应用程序的灵活性和可扩展性。 引用内容: Spring Web MVC: Spring中的MVC封装包提供了Web应用的Model-View-Controller(MVC)实现。 引用:注:本文纯手写实现MVC的实现原理,没有使用设计模式等,代码直接复制即可debug调试查看运行流程,相关解释放在文末。 引用:1,Spring CoreCore封装包是框架的最基础部分,提供IOC和依赖注入特性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [反射机制,Spring AOP 底层实现原理,springmvc的工作原理,Spring七大模块](https://blog.csdn.net/tzydzj/article/details/113742970)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Spring MVC实现原理(手撕代码模拟呈现MVC反射原理)](https://blog.csdn.net/qq_45251343/article/details/119699273)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值