asp.net core 依赖注入问题
最近.net core可以跨平台了,这是一个伟大的事情,为了可以赶上两年以后的跨平台部署大潮,我也加入到了学习之列。今天研究的是依赖注入,但是我发现一个问题,困扰我很久,现在我贴出来,希望可以有人帮忙解决或回复一下。
背景:我测试.net自带的依赖注入生命周期,一共三个:Transient、Scope、Single三种,通过一个GUID在界面展示,但是我发现scope和single的每次都是相同的,并且single实例的guid值每次都会改变。


通过截图可以看到scope和Single每次浏览器刷新都会改变,scope改变可以理解,就是每次请求都会改变。但是single 每次都改变就不对了。应该保持一个唯一值才对。
Program.cs代码:启动代码
namespace CoreStudy
{
public class Program
{
public static void Main(string[] args)
{
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
var host = new WebHostBuilder()
.UseKestrel()//使用服务器serve
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()//使用IIS
.UseStartup<Startup>()//使用起始页
.Build();//IWebHost host.Run();//构建用于宿主应用程序的IWebHost
//然后启动它来监听传入的HTTP请求
}
}
}
Startup.cs 文件代码
namespace CoreStudy
{
public class Startup
{
public Startup(IHostingEnvironment env, ILoggerFactory logger)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
builder.AddInMemoryCollection(); }
// This method gets called by the runtime. Use this method to add services to the container.
// For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=398940
public void ConfigureServices(IServiceCollection services)
{//定义服务
services.AddMvc();
services.AddLogging();
services.AddTransient<IPersonRepository, PersonRepository>();
services.AddTransient<IGuidTransientAppService, TransientAppService>(); services.AddScoped<IGuidScopeAppService, ScopeAppService>(); services.AddSingleton<IGuidSingleAppService, SingleAppService>();
} // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IApplicationLifetime appLifetime)
{//定义中间件 if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseBrowserLink();
app.UseDatabaseErrorPage(); }
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
//app.UseStaticFiles(new StaticFileOptions() {
// FileProvider=new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(),@"staticFiles")),
// RequestPath="/staticfiles"
// });
//默认路由设置
app.UseMvc(routes =>
{
routes.MapRoute(name: "default", template: "{controller=Person}/{action=Index}/{id?}");
}); }
}
}
请注意22-26行,注册了三种不同生命周期的实例,transientService、scopeService以及singleService。
对应的接口定义:
namespace CoreStudy
{
public interface IGuideAppService
{
Guid GuidItem();
}
public interface IGuidTransientAppService:IGuideAppService
{ }
public interface IGuidScopeAppService:IGuideAppService
{ }
public interface IGuidSingleAppService:IGuideAppService
{ } } namespace CoreStudy
{
public class GuidAppService : IGuideAppService
{
private readonly Guid item;
public GuidAppService()
{
item = Guid.NewGuid();
}
public Guid GuidItem()
{
return item;
} }
public class TransientAppService:GuidAppService,IGuidTransientAppService
{ } public class ScopeAppService:GuidAppService,IGuidScopeAppService
{ }
public class SingleAppService:GuidAppService,IGuidSingleAppService
{ }
}
代码很简单,只是定义了三种不同实现类。
控制器中 通过构造函数注入方式注入:
namespace CoreStudy.Controllers
{
/// <summary>
/// 控制器方法
/// </summary>
public class PersonController : Controller
{
private readonly IGuidTransientAppService transientService;
private readonly IGuidScopeAppService scopedService;
private readonly IGuidSingleAppService singleService; private IPersonRepository personRepository = null;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="repository"></param>
public PersonController(IGuidTransientAppService trsn, IGuidScopeAppService scope, IGuidSingleAppService single)
{
this.transientService = trsn;
this.scopedService = scope;
this.singleService = single;
} /// <summary>
/// 主页方法
/// </summary>
/// <returns></returns>
public IActionResult Index()
{
ViewBag.TransientService = this.transientService.GuidItem(); ViewBag.scopeService = this.scopedService.GuidItem(); ViewBag.singleservice = this.scopedService.GuidItem(); return View();
} }
}
控制器对应的视图文件Index.cshtm
@{
ViewData["Title"] = "Person Index";
Layout = null;
}
<form asp-controller="person" method="post" class="form-horizontal" role="form">
<h4>创建账户</h4>
<hr />
<div class="row">
<div class="col-md-4">
<span>TransientService:</span>
@ViewBag.TransientService
</div>
</div>
<div class="row">
<span>Scope</span>
@ViewBag.ScopeService
</div>
<div class="row">
<span>Single</span>
@ViewBag.SingleService
</div>
<div class="col-md-4">
@await Component.InvokeAsync("Greeting");
</div>
</form>
其他无关代码就不粘贴了,希望各位能给个解释,我再看一下代码,是否哪里需要特殊设置。
答案在PersonController 类的 35行,此问题主要是为了能够更好的理解依赖注入
.Net Core来了,我们又可以通过学习来涨工资了。
asp.net core 依赖注入问题的更多相关文章
- # ASP.NET Core依赖注入解读&使用Autofac替代实现
标签: 依赖注入 Autofac ASPNETCore ASP.NET Core依赖注入解读&使用Autofac替代实现 1. 前言 2. ASP.NET Core 中的DI方式 3. Aut ...
- 实现BUG自动检测 - ASP.NET Core依赖注入
我个人比较懒,能自动做的事绝不手动做,最近在用ASP.NET Core写一个项目,过程中会积累一些方便的工具类或框架,分享出来欢迎大家点评. 如果以后有时间的话,我打算写一个系列的[实现BUG自动检测 ...
- [译]ASP.NET Core依赖注入深入讨论
原文链接:ASP.NET Core Dependency Injection Deep Dive - Joonas W's blog 这篇文章我们来深入探讨ASP.NET Core.MVC Core中 ...
- asp.net core 依赖注入几种常见情况
先读一篇注入入门 全面理解 ASP.NET Core 依赖注入, 学习一下基本使用 然后学习一招, 不使用接口规范, 直接写功能类, 一般情况下可以用来做单例. 参考https://www.cnblo ...
- ASP.NET Core依赖注入——依赖注入最佳实践
在这篇文章中,我们将深入研究.NET Core和ASP.NET Core MVC中的依赖注入,将介绍几乎所有可能的选项,依赖注入是ASP.Net Core的核心,我将分享在ASP.Net Core应用 ...
- 自动化CodeReview - ASP.NET Core依赖注入
自动化CodeReview系列目录 自动化CodeReview - ASP.NET Core依赖注入 自动化CodeReview - ASP.NET Core请求参数验证 我个人比较懒,能自动做的事绝 ...
- ASP.NET Core 依赖注入最佳实践——提示与技巧
在这篇文章,我将分享一些在ASP.NET Core程序中使用依赖注入的个人经验和建议.这些原则背后的动机如下: 高效地设计服务和它们的依赖. 预防多线程问题. 预防内存泄漏. 预防潜在的BUG. 这篇 ...
- ASP.NET Core依赖注入最佳实践,提示&技巧
分享翻译一篇Abp框架作者(Halil İbrahim Kalkan)关于ASP.NET Core依赖注入的博文. 在本文中,我将分享我在ASP.NET Core应用程序中使用依赖注入的经验和建议. ...
- ASP.NET Core依赖注入解读&使用Autofac替代实现【转载】
ASP.NET Core依赖注入解读&使用Autofac替代实现 1. 前言 2. ASP.NET Core 中的DI方式 3. Autofac实现和自定义实现扩展方法 3.1 安装Autof ...
- ASP.NET Core 依赖注入基本用法
ASP.NET Core 依赖注入 ASP.NET Core从框架层对依赖注入提供支持.也就是说,如果你不了解依赖注入,将很难适应 ASP.NET Core的开发模式.本文将介绍依赖注入的基本概念,并 ...
随机推荐
- 深入理解CSS中的margin负值
前面的话 margin属性在实际中非常常用,也是平时踩坑较多的地方.margin折叠部分相信不少人都因为这样那样的原因中过招.margin负值也是很常用的功能,很多特殊的布局方法都依赖于它.它看似简单 ...
- mybatis_个人总结
在使用mybatis框架开发数据访问层的过程中,我在这段时间遇到很多细节问题困住我,在这里我来分享一下我遇到的坑,希望能帮到大家. 一.mybatis动态代理方式开发的规范: 1.注意在mybatis ...
- 初步认识TDD
TDD,测试驱动开发(Test Driven Development)是极限编程中倡导的程序开发方法,以其倡导先写测试程序,然后编码实现其功能得名.本文将对TDD有一个较为系统的认识. 基础属性 ...
- Redis的简单动态字符串实现
Redis 没有直接使用 C 语言传统的字符串表示(以空字符结尾的字符数组,以下简称 C 字符串), 而是自己构建了一种名为简单动态字符串(simple dynamic string,sds)的抽象类 ...
- 如何利用tcpdump对mysql进行抓包操作
命令如下: tcpdump -s -l -w - dst -i eno16777736 |strings 其中-i指定监听的网络接口,在RHEL 7下,网络接口名不再是之前的eth0,而是 eno16 ...
- NGINX引入线程池 性能提升9倍
1. 引言 正如我们所知,NGINX采用了异步.事件驱动的方法来处理连接.这种处理方式无需(像使用传统架构的服务器一样)为每个请求创建额外的专用进程或者线程,而是在一个工作进程中处理多个连接和请求.为 ...
- 非技术1-学期总结&ending 2016
好久好久没写博客了,感觉动力都不足了--12月只发了一篇博客,好惭愧-- 今天是2016年最后一天,怎么能不写点东西呢!! 学期总结 大学中最关键一年的第一个学期,共4个月.前20天在学网络方面的,当 ...
- git添加GitHub远程库
已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作 首先,登陆GitHub, ...
- 「译」JUnit 5 系列:环境搭建
原文地址:http://blog.codefx.org/libraries/junit-5-setup/ 原文日期:15, Feb, 2016 译文首发:Linesh 的博客:环境搭建 我的 Gith ...
- 如何理解MySQL中auto_increment?
1.auto_increment用于主键自动增长.比如从1开始增长,当把第一条数据删除,再插入第二条数据时,主键值为2,不是1.