如何在 ASP.Net Web Forms 中使用依赖注入
依赖注入技术就是将一个对象注入到一个需要它的对象中,同时它也是控制反转的一种实现,显而易见,这样可以实现对象之间的解耦并且更方便测试和维护,依赖注入的原则早已经指出了,应用程序的高层模块不依赖于低层模块,而应该统一依赖于抽象或者接口。
在 .Net Framework 4.7.2 中引入了对依赖注入的支持,终于在 ASP.Net Web Forms 中可以使用依赖注入机制了,这篇文章将会讨论如何在 ASP.Net Web Forms 中去使用。
创建 WebForm 项目
在 ASP.Net Web Forms 中使用依赖注入,一定要记得将项目框架设为 4.7.2 以上,要么右键项目在属性面板上选择 4.7.2 版本。
也可以直接在 web.config 做如下设置。
<system.web>
<compilation debug="true" targetFramework="4.7.2" />
<httpRuntime targetFramework="4.7.2" />
...
</system.web>
接下来就可以通过 Nuget 安装 AspNet.WebFormsDependencyInjection.Unity 包,可以通过 Visual Studio 2019 的 NuGet package manager 可视化界面安装 或者 通过 NuGet package manager 命令行工具输入以下命令:
dotnet add package AspNet.WebFormsDependencyInjection.Unity
创建实体 和 接口
现在创建一个名为 Author 实体类 和 IAuthorRepository 接口。
public class Author
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
public interface IAuthorRepository
{
bool Create(Author author);
Author Read(int id);
List<Author> Read();
}
然后再用 AuthorRepository 类实现一下 IAuthorRepository 接口,代码如下:
public class AuthorRepository : IAuthorRepository
{
public bool Create(Author author)
{
throw new System.NotImplementedException();
}
public Author Read(int id)
{
throw new System.NotImplementedException();
}
public List<Author> Read()
{
throw new System.NotImplementedException();
}
}
创建容器和类型注册
现在我们创建 依赖注入容器,然后注入我们想要的类型,下面的代码用于创建 Unity容器。
var container = this.AddUnity();
然后在 Application_Start 事件中进行对象的 依赖配置,如下代码所示:
container.RegisterType<IAuthorRepository, AuthorRepository>();
对了,记的引入一下如下两个命名空间。
AspNet.WebFormsDependencyInjection.Unity
Unity
下面是 Global 类的完整代码,仅供参考。
using Microsoft.AspNet.WebFormsDependencyInjection.Unity;
using System;
using System.Web;
using System.Web.Optimization;
using System.Web.Routing;
using Unity;
namespace WebformsDIDemo
{
public class Global : HttpApplication
{
void Application_Start(object sender, EventArgs e)
{
var container = this.AddUnity();
container.RegisterType<IAuthorRepository, AuthorRepository>();
// Code that runs on application startup
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
}
WebForms 使用依赖注入
现在容器,对象依赖都配置好了,接下来怎么在 Page 中用呢? 可以参考下面的代码。
public partial class _Default : Page
{
private IAuthorRepository _authorRepository;
public _Default(IAuthorRepository authorRepository)
{
_authorRepository = authorRepository;
}
protected void Page_Load(object sender, EventArgs e)
{
}
}
上面的图很明显的显示了,authorRepository 实例在运行时中已被成功注入。
在 .Net Framework 4.7.2 框架以上,终于将 依赖注入机制 带入到了 ASP.Net Web Forms 中,需要明白的是,微软自带的Unity包是一个轻量级的依赖注入容器,可以在 页面,控件,handler,module 上使用,在 ASP.Net Web Forms 中使用依赖注入可以轻松创建对象,然后在运行时获取依赖,可让你轻松构建灵活,松散的应用程序。
更多精彩,欢迎订阅

译文链接:https://www.infoworld.com/article/3397003/how-to-use-dependency-injection-in-aspnet-web-forms.html
如何在 ASP.Net Web Forms 中使用依赖注入的更多相关文章
- ASP.NET Web API中的依赖注入
什么是依赖注入 依赖,就是一个对象需要的另一个对象,比如说,这是我们通常定义的一个用来处理数据访问的存储,让我们用一个例子来解释,首先,定义一个领域模型如下: namespace Pattern.DI ...
- 如何在ASP.NET Web站点中统一页面布局[Creating a Consistent Layout in ASP.NET Web Pages(Razor) Sites]
如何在ASP.NET Web站点中统一页面布局[Creating a Consistent Layout in ASP.NET Web Pages(Razor) Sites] 一.布局页面介绍[Abo ...
- ASP.NET 5 单元测试中使用依赖注入
相关博文:<ASP.NET 5 使用 TestServer 进行单元测试> 在上一篇博文中,主要说的是,使用 TestServer 对 ASP.NET 5 WebApi 进行单元测试,依赖 ...
- 在ASP.NET Web Forms中使用页面导出伪xls Excel表格
将数据导出为Excel表格是比较常见的需求,也有很多组件支持导出真正的Excel表格.由于Excel能打开HTML文件,并支持其中的table元素以及p之类的文本元素的显示,所以把.html扩展名改为 ...
- Dependency Injection in ASP.NET Web API 2 (在web api2 中使用依赖注入)
原文:http://www.asp.net/web-api/overview/advanced/dependency-injection 1 什么是依赖注入(Dependency Injection) ...
- 使用Autofac在ASP.NET Web API上实现依赖注入
在ASP.NET Web API里使用Autofac 1.通过NuGet安装Autofac.WebApi(当时安装的是Autofac 3.1.0) PM > Install-Package Au ...
- 如何在.NET Core控制台程序中使用依赖注入
背景介绍 依赖注入(Dependency Injection), 是面向对象编程中的一种设计原则,可以用来减低代码之间的耦合度.在.NET Core MVC中 我们可以在Startup.cs文件的Co ...
- ASP.NET Core 过滤器中使用依赖注入
如何给过滤器ActionFilterAttribute也用上构造函数注入呢? 一般自定义的过滤器直接用特性方式标识就能使用 [ContentFilter] 因为构造函数在使用的时候要求传参,然后我们可 ...
- Asp.Net Web Forms/MVC/Console App中使用Autofac
本来简单介绍了Autofac在Asp.Net Web Forms中的应用,后来又添加了mvc.控制台应用程序中使用Autofac,详情请看源码. ASP.NET Web Forms使用Autofac, ...
随机推荐
- sql-libs(2) 数字型
经测试,发现是数字型的注入,直接 and 1=1 返回正常,and1=2返回错误,感觉比第一关更加简单一点啊,,透~ 经测试order by 为 3 . 1. union 注入 http://192. ...
- VSCode Plugin & Auto File Header Comments Generator
VSCode Plugin & Auto File Header Comments Generator Xcode SwiftUI // // ContentView.swift // Mem ...
- Linux 学习笔记分享: Linux 用户组的权限: drwx------ 700权限(d 目录 ,r=4,w=2,x=1:rwx=7;---=0;---=0)
Linux 用户组的权限: drwx------ 700权限(d 目录 ,r=4,w=2,x=1:rwx=7;---=0;---=0) 1 1 Linux 用户组的权限: drwx------ 700 ...
- how to export svg form web page in js
how to export svg form web page in js https://stackoverflow.com/questions/2483919/how-to-save-svg-ca ...
- apollo-server 返回模拟数据
模式模拟GraphQL数据 const { ApolloServer, gql } = require('apollo-server'); const typeDefs = gql` type Que ...
- Flutter 删除AppBar的返回icon
设置automaticallyImplyLeading: false即可,替换可以修改"leading"参数 ... appBar: AppBar( automaticallyIm ...
- JUnit5学习之一:基本操作
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- django中间件介绍
在学习django中间件之前,先来认识一下django的生命周期,如下图所示: django生命周期:浏览器发送的请求会先经过wsgiref模块处理解析出request(请求数据)给到中间件,然后通过 ...
- 14_MySQL条件查询
本节所涉及的sql语句: -- 去除结果集中的重复记录 SELECT job FROM t_emp; SELECT DISTINCT job FROM t_emp; SELECT DISTINCT j ...
- RabbitMQ之TTL(Time-To-Live 过期时间)
本文转载自RabbitMQ之TTL(Time-To-Live 过期时间) 概述 RabbitMQ可以对消息和队列设置TTL. 目前有两种方法可以设置.第一种方法是通过队列属性设置,队列中所有消息都有相 ...