.net core依赖注入小结
#依赖注入介绍
.net core 中依赖注入是必不可少的一项必学内容,官方介绍为:依赖注入是一种软件设计模式,指一个或多个依赖(或服务)被注入,或通过引用传递,传入一个依赖对象(或客户端)并成为客户状态的一部分。该模式通过自身的行为分离了客户依赖的创建,允许程序设计是松耦合的,同时遵循依赖倒置和单一职责原则。与服务定位器模式直接进行对比,并允许客户了解他们用来查找依赖的机制。
以上是官方的说法,这里补充一下我个人的看法。当然依赖注入的方式有两个,一个是服务注入,另一个是EF注入,目前只了解了服务注入。
##依赖
当一个类需要另一个类协作来完成工作的时候就产生了依赖,使用接口或基类将依赖关系实现抽象化。
将服务注入到使用它的类的构造函数中。 框架负责创建依赖关系的实例,并在不再需要时将其释放。
比如我们在HomeController这个类中需要完成登录的时候,需要我们通过实现另外一个接口ILogin来完成,那这时候HomeC ontroller就可以依赖于ILogin。这里有一个设计原则:依赖于抽象,而不是具体的实现。临时写了一个简易demo,业务不通别见怪。。可能直接上代码好理解一点:
###HomeController
public class HomeController : Controller
{
private readonly ILogin _login;
//构造函数注入的方式注入
public HomeController(ILogin login)//依赖于ILogin
{
_login= login;
}
public string Login()
{
return _login.GetLogin("xjm1").UserName;
}
}
###ILogin(登录接口)
///定义登录接口
public interface ILogin
{
User GetLogin(string UserName);
}
###MockLogin(接口实现类)
///ILogin的实现类
public class MockLogin: ILogin
{
private List<User> _user;
//初始化一些基本用户信息
public MockLogin()
{
_user= new List<User>()
{
new User(){ UserName = "xjm1",PassWord= "1111",E_mail = "xjm1@126.com"},
new User(){ UserName = "xjm2",PassWord= "2222",E_mail = "xjm2@126.com"},
new User(){ UserName = "xjm3",PassWord= "3333",E_mail = "xjm3@126.com"}
};
}
public User GetLogin(string UserName)
{
return _user.FirstOrDefault(a => a.UserName == UserName);
}
}
###User(用户信息实体类)
///用户信息实体类
public class User
{
//public int Id { get; set; }
public string UserName { get; set; }
public string PassWord{ get; set; }
public string E_mail { get; set; }
}
##注册服务
在服务容器中注册依赖关系。 ASP.NET Core 提供了一个内置的服务容器 IServiceProvider。 服务通常已在应用的 Startup.ConfigureServices 方法中注册。(绑定业务接口与实现类)
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddSingleton<ILogin ,MockLogin>();
//services.AddScoped<ServerInterface, ServerTest1>(); //每次请求,都获取一个新的实例,同一个请求获取多次会得到相同的实例。
//services.AddTransient<ServerInterface, ServerTest1>(); //每次请求,都获取一个新的实例,即使同一个请求获取多次也会是不同的实例
//services.AddSingleton<ServerInterface, ServerTest1>(); //单例模式,每次都获取同一个实例(和静态类几乎一样)
}
##启动Home
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseStaticFiles();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Login}/{id?}");
});
app.Run(async (context) =>
{
await context.Response.WriteAsync("testdemo!");
});
}
其实这些东西很早很早之前就已经接触了,奈何现在重拾,点滴积累,做个笔记,道友共勉~~