1. c#基础
1.1. 变量
-
变量的初始化
-
变量是类或结构中的字段,如果没有显式初始化,创建后默认值为0。
-
方法的局部变量必须显式初始化,否则会产生错误。
-
使用 var 关键字声明的变量必须初始化,否则编译器没有进行类型推断的依据。
-
-
变量的作用域
-
在 for、while 或类似语句中声明的局部变量存在于该循环体中。
-
字段和局部变量的作用域冲突,参考下例:
public class ScopeTest2 { static int j = 20; public static void Main() { int j = 30; Console.WriteLine(j); //30 Console.WriteLine(ScopeTest2.j); //20 return; } }
-
如果要访问一个实例字段,需要使用 this 关键字。
-
1.2. 类型(15种)
1.2.1. 值类型(13种)
-
内置的CTS值类型表示基本类型,如整型、浮点类型、字符类型和布尔类型。
-
整型(8种):
Name
CTS Type
Description
Range (min:max)
sbyte
System.SByte
8-bit signed integer
-128:127 (-27:27–1)
short
System.Int16
16-bit signed integer
-32,768:32,767 (-215:215–1)
int
System.Int32
32-bit signed integer
-2,147,483,648:2,147,483,647 (-231:231–1)
long
System.Int64
64-bit signed integer
-9,223,372,036,854,775,808:9,223,372,036,854,775,807 (-263:263–1)
byte
System.Byte
8-bit unsigned integer
0:255 (0:28–1)
ushort
System.UInt16
16-bit unsigned integer
0:65,535 (0:216–1)
uint
System.UInt32
32-bit unsigned integer
0:4,294,967,295 (0:232–1)
ulong
System.UInt64
64-bit unsigned integer
0:18,446,744,073,709,551,615 (0:264–1)
-
浮点类型(2种):
Name
CTS Type
Description
Significant Figures
Range (Approximate)
float
System.Single
32-bit, single-precision floating point
7
±1.5 × 10245 to ±3.4 × 1038
double
System.Double
64-bit, double-precision floating point
15/16
±5.0 × 102324 to ±1.7 × 10308
-
decimal 类型:
Name
CTS Type
Description
Significant Figures
Range (Approximate)
decimal
System.Decimal
128-bit, high-precision decimal notation
28
±1.0 × 10228 to ± 7.9 × 1028
decimal类型不是基本类型,所以计算时会有性能损失。 使用时,在数字后加上字符M(或m):
decimal d = 12.30M;
-
bool 类型:
Name
CTS Type
Description
Significant Figures
Range (Approximate)
bool
System.Boolean
Represents true or false
NA
true or false
bool值和整数值不能相互隐式转换。例如试图用0表示false、非0值表示true,就会出错。 -
字符类型:
Name
CTS Type
Values
char
System.Char
Represents a single 16-bit (Unicode) character
char类型的字面量是用单引号括起来的,如果把字符放在双引号中,编译器会把它看作字符串而产生错误。 -
除了把char表示为字符字面量,还可以用4位十六进制的Unicode值(如'\u0041')、带有数据类型转换的整数值(如(char)65)或十六进制数(如'\x0041')表示。
-
转义特殊符号:
Escape Sequence
Character
\'
Single quotation mark
\"
Double quotation mark
\\
Backslash
\0
Null
\a
Alert
\b
Backspace
\f
Form feed
\n
Newline
\r
Carriage return
\t
Tab character
\v
Vertical tab
-
1.2.2. 引用类型(2种)
-
object 类型:
Name
CTS Type
Description
object
System.Object
The root type. All other types (including value types) in the CTS are derived from object.
-
string 类型:
Name
CTS Type
Description
string
System.String
Unicode character string
-
string是一个引用类型,但与引用类型的常见行为有一些区别。例如,字符串不可改变。
-
String对象被分配在堆上,而不是栈上。
-
字符串格式化
代码
说明
C
本地货币格式
D
十进制格式,把整数转为以10为基数的数,如给定精度说明符,则加上前导0
E
科学记数法(指数)格式,精度说明符设置小数位数(默认为6),格式字符的大小写(e或E)确定指数符号的大小写
F
固定点格式,精度说明符设置小数位数,可为0
G
普通格式,使用E或F格式取决于哪种格式较简单
N
数字格式,加逗号表示千分符
P
百分数格式
X
十六进制格式,精度说明符用于加上前导0
-
以下2行代码等效:
string filepath = "C\\Programs\\Test.cs"; string filepath = @"C\Programs\Test.cs";
-
1.2.3. 自定义类是引用类型。自定义的值类型,需要声明为结构。
1.3. 修饰符
-
可见性修饰符
修饰符
应用于
说明
public
所有类型或成员
任何代码均可以访问
protected
类型和内嵌类型的所有成员
只有派生的类型能访问
internal
所有类型或成员
只能在包含它的程序集中访问
private
类型和内嵌类型的所有成员
只能在它所属的类型中访问
protected internal
类型和内嵌类型的所有成员
只能在派生类型和包含它的程序集中访问
-
其他修饰符
修饰符
应用于
说明
new
函数成员
成员用相同的签名隐藏继承的成员
static
所有成员
成员不作用于类的具体实例
virtual
仅函数成员
成员可以由派生类重写
abstract
仅函数成员
虚拟成员定义了成员的签名,但不提供实现
override
仅函数成员
成员重写了继承的虚拟或抽象成员
sealed
类、方法和属性
对于类,不能被继承。对于方法和属性,成员可重写继承的虚拟成员,但不能被任何派生类的任何成员所重写。必须和 override 一起使用。
extern
仅静态[dll import]方法
成员在外部用不同的语言实现。
1.4. XML 文档
使用3斜杠(///)注释的内容可以被自动提取创建为 XML 格式的文档说明。
-
特殊标记
标记
说明
<c>
把行中的文本标记为代码
<code>
把多行标记为代码
<example>
标记为一个代码示例
<exception>
说明一个异常类(编译器要验证其语法)
<include>
包含其他文档说明文件的注释(编译器要验证其语法)
<list>
把列表插入文档中
<para>
Gives structure to text
<param>
标记方法的参数(编译器要验证其语法)
<paramref>
表示一个单词是方法的参数(编译器要验证其语法)
<permission>
说明对成员的访问(编译器要验证其语法)
<remarks>
给成员添加描述
<returns>
说明方法的返回值
<see>
提供对另一个参数的交叉引用(编译器要验证其语法)
<seealso>
提供描述中的“参见”部分(编译器要验证其语法)
<summary>
提供类型或成员的简短小结
<typeparam>
用在泛型类型的注释中以说明一个类型参数
<typepararef>
类型参数的名称
<value>
描述属性
1.5. 预处理器指令
-
#define 和 #undef
-
#if 、 #elif 、 #else 和 #endif
-
#warning 和 #error
-
#region 和 #endregion
-
#line
-
#pragma
1.6. LINQ
-
一些有用的 LINQ 扩展方法
扩展方法
描述
延迟
All
如果源数据中的所有条目都与谓词匹配,则返回 true
否
Any
如果源数据中至少有一个条目与谓词匹配,则返回 true
否
Contains
如果数据源含有指定的条目或值,则返回 true
否
Count
返回数据源中的条目数
否
First
返回数据源的第一个条目
否
FirstOrDefault
返回数据源的第一个条目,或无条目时,返回默认值
否
Last
返回数据源的最后一个条目
否
LastOrDefault
返回数据源的最后条目,或无条目时,返回默认值
否
Max / Min
返回由 lambda 表达式表示的最大值或最小值
否
OrderBy / OrderByDescending
基于 lambda 表达式返回的值对数据源进行排序
是
Reverse
反转数据源中数据项的顺序
是
Select
设计一个查询结果
是
SelectMany
把每个数据项投射到一个条目序列之中,然后把所有这些结果序列连接成一个序列
是
Single
返回数据源的第一个条目,或者有多个匹配时抛出一个异常
否
SingleOrDefault
返回数据源的第一个条目,或者无条目时,返回默认值;有多个匹配条目时,抛出一个异常
否
Skip / SkipWhile
跳过指定数目的元素,或者当谓词匹配时跳过
是
Sum
对谓词选定的值求和
否
Take / TakeWhile
从数据源的开始处选择指定数目的元素,或当谓词匹配时选择条目
是
ToArray / ToDictionary / ToList
把数据源转换成数组或其他集合类型
否
Where
过滤掉数据源中与谓词不匹配的条目
是
1.7. 继承
-
继承的类型
-
实现继承
-
接口继承
-
不支持多重实现继承,允许多重接口继承。
-
不支持私有继承。
-
-
构造函数
构造时的执行顺序是:先基类,后派生类。
-
virtual(虚方法)
-
函数默认情况下不是虚拟的。
-
把基类函数声明为 virtual,就可以在任何派生类中 override(重写)该函数。
使用基类声明派生类时,override(重写)会【改变】方法的功能。
如需调用函数的基类版本,可使用 base.<MethodName> 。
-
-
new(隐藏方法)
-
如果签名相同的方法在基类和派生类中都进行了声明,但没有分别使用 virtual 和 override,派生类方法就会隐藏基类方法。
-
隐藏基类方法应使用 new 进行显式声明,否则系统会发出警告。
-
除非确实必要,一般不推荐使用 new(隐藏方法)。
使用基类声明派生类时,new(隐藏方法)【不改变】方法的功能。
-
-
abstract(抽象类和抽象函数)
-
抽象类不能实例化。
-
抽象函数不能直接实现,必须在非抽象的派生类中实现。
-
抽象函数本身也是虚拟的(不需要提供 virtual 关键字)。
-
如果类包含抽象函数,则该类也是抽象的,必须相应声明。
-
-
sealed(密封类和密封方法)
-
对于类,表示不能继承该类。
-
对于方法,表示不能重写该方法。
-
要在方法或属性上使用 sealed 关键字,必须先重写于一个基类。如果基类上不希望有重写的方法或属性,就不要声明为 virtual。
-
-
扩展方法必须为静态,且必须在静态类中定义。
-
用法举例(virtual/override/new):
class A { public virtual void Func() // 虚函数,允许override { Console.WriteLine("Func In A"); } public void Non_virtual() // 非虚函数 { Console.WriteLine("Non virtual func in A"); } } class B : A { public override void Func() // 虚函数,override { Console.WriteLine("Func In B"); } public void Non_virtual() // 非虚函数,不能override,隐式隐藏 { Console.WriteLine("Non virtual func in B"); } } class C : B { public void Non_virtual() // 非虚函数,不能override,隐式隐藏 { Console.WriteLine("Non virtual func in C"); } } class D : A { public new void Func() // 基类是虚函数,显式new { Console.WriteLine("Func In D"); } public new void Non_virtual() // 基类是非虚函数,显式new { Console.WriteLine("Non virtual func in D"); } } class Program { static void Main(string[] args) { A a = new A(); A b = new B(); A c = new C(); A d = new D(); a.Func(); // Func In A b.Func(); // Func In B,基类声明,override 会【改变】方法的功能。 c.Func(); // Func In B d.Func(); // Func In A,基类声明,new 【不改变】方法的功能。 D d1 = new D(); d1.Func(); // Func In D,非基类声明,执行派生类的方法。 a.Non_virtual(); // Non virtual func in A b.Non_virtual(); // Non virtual func in A c.Non_virtual(); // Non virtual func in A d.Non_virtual(); // Non virtual func in A d1.Non_virtual(); // Non virtual func in D Console.ReadLine(); } }
1.8. 规则和习惯做法
-
命名规则
-
公有属性采用 Pascal 大小写形式命名,如果存在一个等价的私有字段,则采用 camel 大小写形式命名。把下划线(_)作为前缀,会为识别字段提供极大便利。
-
接口名称通常以字母 I 开头。
-
1.9. 其他
-
运算符计算顺序举例:
int a = 5; int b = a++ + (++a) * 2 + ++a; // b = 5 + 7 * 2 + 8 = 27
-
除非特别指定,C#的所有引用类型都通过引用来传递,所有值类型都通过值来传递。
-
强制值参数通过引用传递给方法,可以使用
ref
关键字,例如:static void SomeFunction(int[] ints, ref int i) { ints[0] = 100; i = 100; // The change to i will persist after SomeFunction() exits. } SomeFunction(ints, ref i);
-
在方法的输入参数前加上 out 前缀,传递给该方法的变量可以不初始化。
static void SomeFunction(out int i) { i = 100; } public static int Main() { int i; // note how i is declared but not initialized. SomeFunction(out i); Console.WriteLine(i); return 0; }
-
-
如果提供了带参数的
构造函数
,编译器就不再自动提供默认的构造函数。-
类有一些静态字段或属性,需要在第一次使用类之前从外部源中初始化,可以使用
静态构造函数
。-
静态构造函数总是由.NET运行库调用,所以没有访问修饰符(无意义)
-
不能带任何参数
-
一个类只有一个静态构造函数
-
只能访问类的静态成员,不能访问实例成员
-
静态构造函数和无参数的实例构造函数可以在同一个类中定义,加载类时执行前者,创建实例时执行后者。
-
若多个类中都有静态构造函数,先执行哪个无法确定。一个静态构造函数中的代码不应依赖于其他静态构造函数。
-
-
-
只读字段
-
readonly 关键字比 const 更灵活,可以在构造函数中赋值,但不能在其他地方赋值。
-
可以是实例字段,而不是静态字段,类的每个实例可以有不同的值。
-
如果要把只读字段设置为静态,必须显式声明。
-
-
弱引用
-
实例化一个类或结构时,只要有代码引用它,就会形成强引用,垃圾回收器不会清理 MyClass 对象使用的内存。
MyClass myClassVariable = new MyClass();
-
如果类对象很大又不经常访问,(特殊情况下)可以创建对象的弱引用(WeakReference)。
-
-
System.Object()方法
-
ToString()
-
GetHashCode()
-
Equals() 和 ReferenceEquals()
-
Finalize()
-
GetType()
-
MemberwiseClone()
-
-
使用
csc.exe
编译:-
选项
选项
输出
/t:exe
控制台应用程序(默认)
/t:library
带有清单的类库
/t:module
没有清单的组件
/t:winexe
Windows应用程序(无控制台窗口)
/out
指定编译后生成的输出文件名
/r (/reference)
指定引用库
举例:
// 生成dll csc /t:library MathLibrary.cs // 生成exe csc MathClient.cs /r:MathLibrary.dll // 执行exe MathClient.exe
-
1.10. FAQ
-
class
和struct
的区别?-
class
是存储在堆(heap)上的引用类型,而struct
是存储在栈(stack)上的值类型。 -
struct
不支持继承。(唯一例外是最终派生于 System.Object,继承链为:* ← System.ValueType ← System.Object) -
struct
不允许定义无参数的构造函数。(编译器总是提供一个无参数的默认构造函数,不允许替换。) -
较小的数据类型使用
struct
可以提高性能。 -
struct
可以指定字段如何在内存中布局。
-
-
xxxxx
xxx
2. ASP.NET
2.1. ASP.NET 基础
2.1.1. Web窗体
-
Web窗体代码片段类型
代码
含义
<%
表示标准代码片段,其中包含由ASP.NET Framework计算的代码语句。如果希望发送给浏览器的响应中包含HTML,则必须在代码片段中使用Response.Write方法。
<%=
表示内容代码片段。与标准代码片段相似,但其结果将被插入到发送给浏览器的响应中,无需显式调用Response.Write。
<%:
表示已编码代码片段。类似于<%=,但响应将进行HTML编码。
<%#
表示数据绑定代码片段,用于引用当前数据对象。
<%#:
表示已编码数据绑定代码片段,期中的数据绑定值已编码。
<%$
属性代码片段。用于引用配置值(如那些在Web.config中定义的值)。
<%@
表示指令,用于配置Web窗体(或控件和母版页,具体因指令的类型而异)。
2.1.2. 生命周期和上下文
-
HttpApplication类定义的请求生命周期事件
名称 说明 Start
Application_Start
BeginRequest
ASP.NET Framework收到新请求时触发的第一个事件
AuthenticateRequest PostAuthenticateRequest
当ASP.NET Framework需要识别提出请求的用户时,将触发AuthenticateRequest事件。处理完所有事件处理程序后,将触发PostAuthenticateRequest事件
AuthorizeRequest PostAuthorizeRequest
当ASP.NET Framework需要授权请求时,将触发AuthorizeRequest事件。处理完所有事件处理程序后,将触发PostAuthorizeRequest事件
ResolveRequestCache PostResolveRequestCache
当ASP.NET Framework需要解析缓存数据中的请求时,将触发ResolveRequestCache事件。处理完所有事件处理程序后,将触发PostResolveRequestCache事件
MapRequestHandler PostMapRequestHandler
当ASP.NET Framework需要为请求查找处理程序时,将触发MapRequestHandler事件。选择处理程序后,将触发PostMapRequestHandler事件
Session_Start
Session_Start
AcquireRequestState PostAcquireRequestState
当ASP.NET Framework需要与请求关联的状态(会话状态)时,将触发AcquireRequestState事件。处理完所有事件处理程序后,将触发PostAcquireRequestState事件
PreRequestHandlerExecute
在要求处理程序处理请求之前,会立即触发这些事件
显示页面
-
PostRequestHandlerExecute
在要求处理程序处理请求之后,会立即触发这些事件
ReleaseRequestState PostReleaseRequestState
当ASP.NET Framework不再需要与请求关联的状态时,将触发ReleaseRequestState事件。处理完所有事件处理程序后,将触发PostReleaseRequestState事件。
UpdateRequestCache
触发此事件以便负责缓存的模块更新其状态。
LogRequest PostLogRequest
当ASP.NET Framework需要记录此请求的详细信息时,将触发LogRequest事件。处理完所有事件处理程序后,将触发PostLogRequest事件。
EndRequest
当ASP.NET Framework处理完请求、准备向浏览器发送响应时,将触发EndRequest事件
PreSendRequestHeaders
将在向浏览器发送HTTP标头之前触发PreSendRequestHeaders事件
PreSendRequestContent
将在发送标头之后、在向浏览器发送内容之前触发PreSendRequestContent事件
Error
将在遇到错误时触发Error事件——处理请求的任何阶段都可能发生此事件
End
Application_End
-
HttpContext 成员
名称 说明 Application
返回用于管理应用程序状态数据的HttpApplicationState对象
ApplicationInstance
返回与当前请求关联的HttpApplication对象
Cache
返回用于缓存响应数据的Cache对象
Current
(静态)返回当前请求的HttpContext对象
IsDebuggingEnabled
如果已将调试器附加到Web窗体应用程序,则返回true。可以将此成员用于执行特定于调试的操作,但如果要这样做,部署之前请在不使用调试器的情况下进行全面测试。
Items
返回可用于在参与处理请求的ASP.NET Framework组件之间传递状态数据的集合
GetSection(name)
从Web.config文件中获取指定的配置部分
Profile
返回用于访问每个用户配置文件数据的ProfileBase对象。并非所有的安全模块都会设置此值,因此,应该使用ProfileBase.Create方法
Request
返回提供所处理的请求的详细信息的HttpRequest对象
Response
返回一个HttpResponse对象,该对象提供正在构建并将发送到浏览器的响应的详细信息
Session
返回用于访问会话状态的HttpSession状态对象。此属性将返回null,直到触发PostAcquireRequestState应用程序事件
Server
返回一个HttpServerUtility对象,其中可能包含实用功能,最有用的功能包括:用于对字符串进行安全编码已将其作为HTML显示的方法,以及用于控制请求处理程序执行的功能
TimeStamp
返回一个DateTime对象,其中包含创建HttpContext对象的时间
User
返回用于访问有关请求的安全信息的IPrincipal接口实现
-
HttpApplication 成员
名称 说明 Application
与HttpContext.Application属性对应
CompleteRequest()
废弃当前请求的生命周期,直接转到EndRequest事件
Context
返回当前请求的HttpContext对象
Init()
在每个注册的模块上调用Init方法后调用
Modules
返回提供应用程序中模块详细信息的HttpModuleCollection对象
RegisterModule(type)
添加一个新模块
Request
返回HttpContext.Request的值,但如果该值为null,将抛出HttpException
Response
返回HttpContext.Response的值,但如果该值为null,将抛出HttpException
Server
与HttpContext.Server属性对应
Session
返回HttpContext.Session的值,但如果该值为null,将抛出HttpException
User
返回HttpContext.User的值,但如果该值为null,将抛出HttpException
-
HttpRequest 属性
名称 说明 AcceptTypes
返回浏览器接受的MIME类型的字符串数组
Browser
返回描述浏览器功能的HttpBrowserCapabilities对象
ContentEncoding
返回一个System.Text.Encoding对象,该对象表示用于对请求数据进行编码的字符集
ContentLength
返回请求中内容的字节数
ContentType
返回请求中内容的MIME类型
Cookies
返回包含请求中的cookie的HttpCookieCollection对象
Files
返回浏览器在窗体中发送的文件的集合
Form
用于访问窗体数据
Headers
返回一个包含请求头的集合
HttpMethod
返回用于提出请求的HTTP方法(GET、POST等)
InputStream
返回可用于读取请求内容的流
IsLocal
如果请求源自本地计算机,则返回true
Params
查询字符串、窗体字段和cookie中的组合数据项的集合。也可以直接在HttpRequest对象上使用数组风格的索引器,以使Request[“myname”]与Request.Params[“myname”]相同
QueryString
返回查询字符串参数的集合
RawUrl
返回URL中域名之后的部分
Url
以System.Uri对象的形式返回请求URL
UrlReferrer
以System.Uri对象的形式返回引用URL
UserAgent
返回浏览器提供的用户代理字符串
UserHostAddress
返回远程客户端的IP地址(用字符串表示)
UserHostName
返回远程客户端的DNS名称
UserLanguages
返回浏览器/用户首选的语言的字符串数组
-
HttpResponse 属性
名称 说明 AppendCookie(cookie)
用于将cookie添加到集合中的便捷方法
AppendHeader(name, val)
用于在响应中添加新头部的便捷方法
BufferOutput
获取或设置一个值,表明是否应在将请求发送给浏览器之前完全缓冲请求,默认值为true。如果将此值更改为false,随后的模块和处理程序将无法更改响应
Cache
返回为响应指定缓存策略的HttpCachePolicy对象
CacheControl
获取或设置响应的cache-control HTTP标头
Charset
获取或设置为响应指定的字符集
Clear() ClearContent()
这些方法是等价的,用于从响应中删除内容
ClearHeaders()
从响应中删除所有头部
ContentEncoding
获取或设置响应中内容的编码
Cookies
获取响应的cookie集合
Headers
返回响应头的集合
IsClientConnected
如果客户端仍连接到服务器,则返回true
IsRequestBeingDirected
如果将向浏览器发送重定向,则返回true
Output
返回可用于向响应中写入文本的TextWriter
OutputStream
返回可用于向响应中写入二进制数据的Stream
RedirectLocation
获取或设置HTTP Location头的值
Status
获取或设置响应的状态,默认值为200(OK)
StatusCode
获取或设置状态的数字部分,默认值为200
StatusDescription
获取或设置状态的文本部分,默认值为(OK)
SuppressContent
如果设置为true,会避免将响应内容发送给客户端
Write(data)
将数据写入到响应输出流中
WriteFile(path)
将指定文件的内容写入到输出流中
2.1.3. 模块(Modules)和处理程序(Handlers)
-
HttpModulesCollection 属性
名称 说明 AllKeys
返回一个包含所有已注册模块名称的字符串数组
Count
返回已注册的模块数
-
模块(Module)与处理程序(Handler)的选择
-
定制现有应用处理响应的方式,使用模块。
-
创建新的Web应用,使用处理程序。
-
模块为处理程序准备请求,处理程序为客户端生成响应。不要在模块中生成响应,也不要在处理程序中实现请求功能(如状态管理和安全性)。
-
2.1.4. 页面和控件的事件
-
System.Web.UI.Page类事件
名称 说明 PreInit
在ASP.NET Framework调用由IHttpHandler接口定义的ProcessRequest方法后触发。此事件用于配置页面,通常通过设置与Page指令中的特性对应的属性的值来完成操作
Init
在将页面中的所有控件发送给Initial事件后触发
InitComplete
在设置视图状态时触发。在触发此事件之前分配的视图状态数据值将会丢失
PreLoad
在处理请求中的数据后触发。这些数据包括视图状态和表单数据
Load
在将Load事件发送给Web窗体中的控件之前触发。此事件有助于设置控件所需的资源(如数据库)
LoadComplete
在执行所有控件的事件处理程序后触发。这包括控件Load事件以及控件触发的任何自定义事件
PreRender
在从Web窗体生成HTML响应之前触发。此事件用于对Web窗体内容、可编程HTML元素或它包含的控件做出最终调整
PreRenderComplete
在将PreRender事件发送给Web窗体包含的控件后调用
SaveStateComplete
在保存状态数据(包括视图和会话状态)后触发。在触发此事件之后对状态所做的更改将会丢失,但它们将会影响HTML响应
Unload
在生成HTML响应以便释放Web窗体使用的所有资源(如数据库连接)后触发
Error
在Web窗体或它包含的其中一个控件中出现未经处理的异常时触发。此事件可以在事件序列的任何位置触发
-
发送给控件的事件
名称 说明 Init
在首次初始化控件时触发。处理此事件可执行基本的初始化,如设置数据库连接。可以访问有关请求的基本信息,但视图状态和表单数据不可用。不要尝试访问其他控件,因为它们可能尚未初始化
Load
在视图状态和表单数据可用时触发。可以定位Web窗体中的其他控件并与其交互
PreRender
在调用Render方法来为响应生成HTML片段之前触发。处理此事件可设置要生成的内容,包括管理包含在标记中的嵌套控件
Unload
在呈现过程之后调用。处理此事件可释放一直使用的任何资源,如数据库连接
2.1.5. 管理请求执行过程
2.1.6. 管理状态数据
-
HttpApplication类定义的部分成员
成员 说明 AllKeys
返回包含所有键值的字符串数组
Count
返回应用程序数据项的数量
Clear()
删除应用程序状态中的所有数据项
Lock()
序列化对应用程序数据的访问
Remove(key)
从应用程序状态中删除包含指定键的项
Unlock()
解锁应用程序数据,以便执行并发更新
不要尝试将实例变量设置为 static 来避免状态丢失问题。这基本上等同于使用应用程序数据,但这会强制使 ASP.NET Framework 序列化对变量的访问,因而降低应用程序的性能。如果确实应用了static关键字,则需要确保安全更新数据(需要用到并行编程技术)。
Application属性存储的数据保存在内存中,在停止或重启应用程序时,数据将丢失。
-
配置文件 Web.config
-
add元素创建连接字符串时定义的特性
特性 说明 name
指定此连接的名称。该名称用于引用连接(多数情况位于Web.config文件的其他位置)。
connectionString
连接的详细信息
providerName
将用于连接到数据库类的类型。默认值为System.Data.SqlClient。
-
profile元素定义的特性
特性 说明 enabled
(可选)指定是否启用配置文件功能。默认值为true。
defaultProvider
指定provider元素的name特性值,用于获取配置文件值。可使用properties/add元素中的提供程序特性在 各种属性中改写此值。
-
profile/providers/add元素定义的特性
特性 说明 name
指定此提供程序的名称。该名称通常与profile元素中defaultProvider特性的值相同。
type
指定将实例化以提供配置文件值的类。
connectionStringName
将用于连接到数据库的连接字符串的名称。此值与Web.config文件connectionStrings部分中的元素 对应。
applicationName
(可选)为应用程序指定名称。此特性有利于两个不同的ASP.NET Framework应用程序共享相同的配置文件 数据。如果省略此特性,将自动生成唯一的名称。
commandTimeout
(可选)指定SQL命令超时的秒数。默认值为30,表示30秒。
description
(可选)为提供程序指定说明。极少用。
-
profile/properties/add元素定义的特性
特性 说明 name
所定义的配置文件属性的名称。
type
(可选)属性的类型。如果省略该属性,则取默认值String。正确设置此值可以更轻松的解析或转换值。
provider
(可选)为此值指定提供程序。可以通过不同的provider获取每个属性。如果省略此特性,则使用profile元素中的 defaultProvider特性值。
allowAnonymous
(可选)如果为true,则匿名请求可以访问配置文件的属性。默认值为false。
defaultValue
(可选)如果数据库中没有用户的已存储值,则设置为分配给该属性的默认值。如果省略此值,则使用属性类型的 默认值:string类型为空字符串,int类型为零,等等。还可以将此特性设置为String null,意味着将使用null值。
readOnly
(可选)如果为true,将无法更改。默认值为false。
-
sessionState元素定义的特性
名称 说明 allowCustomSqlDatabase
使用非默认的会话数据库时,需要指定为true。
cookieless
指定如何使用cookie将请求与会话关联。默认值为为AutoDetect,此时ASP.NET Framework将确定浏览器是否支持 cookie,如果不支持,则将会话信息嵌入在URL中。其他值包括UseCookies和UseUri,分别用于强制使用cookie和URL。
cookieName
指定用于存储会话ID的cookie名称。默认值为 ASP.NET_SessionId 。
mode
指定如何存储会话数据。默认值为InProc,指将会话数据存储在ASP.NET Framework应用程序中。其他值包括:Off(对整个 应用程序禁用会话状态)、SQLServer以及StateServer。
sqlConnectionString
用于在SQL数据库中存储会话数据时指定数据库服务器连接的详细信息。
stateConnectionString
用于在状态服务器中存储会话数据时指定服务器进程连接的详细信息。
-
如何启用ASP.NET状态服务器?
-
如果是本地计算机,打开【服务】,启动 ASP.NET State Service 。
-
如果是在另一台计算机上运行状态服务器,需要将注册表属性 HKLM\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters\AllowRemoteConnection 改为1,然后添加一条防火墙规则,允许在端口42424上传入请求。
-
在应用程序中将stateConnectionString特性指定为 tcpip=<servername>:42424
-
42424 是状态服务器的默认端口,可以在 HKLM\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters\Port 中修改端口。
-
-
-
-
ProfileBase类定义的成员
名称 说明 IsAnonymous
如果配置文件用于匿名用户,则返回true。
IsDirty
如果配置文件中的一个或多个属性已发生更改,则返回true。可以使用此属性避免不必要的调用Save方法。
LastActivityDate
返回DateTime,表示上次读取或修改配置文件的时间。
LastUpdatedDate
返回DateTime,表示上次修改配置文件的时间。
Properties
(静态)返回配置文件属性的集合。
UserName
返回配置文件所代表用户的名称。
Create(name)、Create(name, auth)
加载指定用户的配置文件。auth参数是一个bool值,如果为true,则表示用户已通过 身份验证,如果为false,则为匿名用户。
Save()
保存已更改的配置文件属性值。
-
HttpSessionState类定义的成员
名称 说明 Count
返回会话数据项的数量。
IsCookieLess
在请求中添加cookie或在请求URL中添加相关信息,将请求与会话关联。如果使用请求URL选项,此属性返回true。
IsNewSession
如果这是第一个会话请求,则返回true。
IsReadOnly
如果会话数据是只读数据(需将Web窗体Page指令中的EnableSessionState特性设置为ReadOnly),则返回true。
Keys
返回所有会话状态数据项的键的集合。
Mode
返回如何使用System.Web.SessionState.SessionStateMode枚举中的值存储会话数据的详细信息。
SessionID
返回当前会话的唯一ID
Abandon()
结束当前会话。随后提出任何其他请求都会创建一个新会话。
Clear()
从当前会话的会话状态中删除所有数据项。
-
会话数据库
-
创建会话数据库
打开命令行,导航到 C:\Windows\Microsoft.NET\Framework\v4.0.30319 (.NET Framework版本不同,路径可能不同), 运行以下命令:
.\aspnet_regsql.exe -S "(localdb)\v11.0" -E -ssadd -sstype p // -S: 指定数据库服务器 // -E: 指定应使用Windows凭据对数据库连接进行身份验证。 // -ssadd: 用于创建会话数据库。 // -sstype: 指定应如何存储数据。
Table 1. 会话状态数据库的数据存储选项 选项 说明 t
在数据库ASPState中创建用于管理会话数据的存储过程,但数据本身不是持久的,如果重启数据库,数据将丢失。
p
存储过程和数据在数据库ASPState中持久存在。即使重启数据库,数据不会丢失。
c
在 -d 选项指定名称的数据库中创建存储过程和数据。即使重启数据库,数据不会丢失。
-
使用会话数据库
// 按默认数据库使用,NG,应去除Initial Catalog 特性。 <sessionState timeout="60" mode="SQLServer" sqlConnectionString="Data Source=(localdb)\v11.0;Initial Catalog=ASPState;Integrated Security=True" /> // 按默认数据库使用,OK,ASP.NET Framework将自动查找数据库ASPState。 <sessionState timeout="60" mode="SQLServer" sqlConnectionString="Data Source=(localdb)\v11.0;Integrated Security=True" /> // 按自定义数据库使用,需增加 allowCustomSqlDatabase 特性 <sessionState timeout="60" mode="SQLServer" allowCustomSqlDatabase="true" sqlConnectionString="Data Source=(localdb)\v11.0;Initial Catalog=ASPState;Integrated Security=True" />
-
-
HttpCookieCollection类定义的成员
名称 说明 Add(cookie)
在集合中添加一个新cookie
Clear()
删除所有cookie
CopyTo(array)
将cookie复制到HttpCookie数组
Count
返回集合中cookie的数量
Keys
返回cookie名称的集合
Remove(name)
从集合中删除指定名称的cookie
-
HttpCookie类定义的成员
名称 说明 Domain
获取并设置与cookie关联的域
Expires
获取或设置cookie的到期时间
HttpOnly
获取或设置是否可以通过Ajax Javascript调用访问cookie
Name
获取或设置cookie的名称
Secure
获取或设置是否仅通过SSL连接传送cookie
Shareable
获取或设置是否应缓存和共享cookie值
Value
获取或设置cookie的值
建议避免在ASP.NET Framework应用程序中直接使用cookie,而应采用会话数据或配置文件数据。
2.1.7. 缓存
2.1.8. 错误处理
2.1.9. 管理路径
2.1.10. URL路由
2.1.11. 身份验证和授权
-
Authentication/Forms元素定义的特性
名称 说明 cookieless
定义是使用cookie来标识用户,还是将用户信息编码到URL中。支持的值包括 UseCookies(始终使用cookie)、 UseUri(从不使用cookie)、AutoDetect(如果设备支持,则使用cookie)和 UseDeviceProfile(如果浏览器支持,则使用 cookie)。默认值为 UseDeviceProfile。
defaultUrl
指定在身份验证之后将浏览器定向到的URL。
Domain
为身份验证cookie指定域。默认值为空字符串("")。设置此特性可以在子域之间共享cookie。
enableCrossAppRedirects
如果设置为true,则可以将通过身份验证的用户重定向到其他适当配置的应用程序。
loginUrl
指定当请求中不包含身份验证令牌时,对于指向需要身份验证的URL的请求,要将浏览器定向到的URL。
Name
设置用于将用户身份与浏览器提出的请求关联的cookie的名称。
Path
指定cookie的路径。默认值为/,表示将cookie应用于整个站点。
Protection
指定如何保护身份验证cookie。支持的值包括Encryption(加密cookie)、Validation(验证cookie的内容, 以确保未对它们做出修改)、All(加密并且验证cookie)和None(完全不保护cookie)。默认值为All。
requireSSL
如果设置为true,此特性将配置身份验证cookie,以便浏览器仅为通过SSL提出的请求提交cookie。默认值为False 。建议启用此特性,有助于防止身份验证cookie被捕获并被添加到用于假冒用户的恶意请求中。
slidingExpiration
如果设置为true,将在每次收到请求时更新身份验证cookie,以便相对于用户最新提出的请求应用timeout 特性的值。如果设置为false,将相对于身份验证的时间应用timeout特性的值。默认值为true。
ticketCompatibilityMode
指定如何表示身份验证过期日期。如果值为Framework20,将使用本地时间;如果值为Framework40 ,将使用UTC。默认值为Framework20,但如果应用程序是通过单一URL部署的,但受不同时区的数据中心支持,则应使用Framework40。
Timeout
指定cookie过期前的分钟数。如果将slidingExpiration特性设置为true,则会更新cookie,以相对于最新提出的请求 设置过期。否则,将相对于身份验证的时间设置过期。默认值为30,表示30分钟。
-
FormsAuthentication 类定义的方法和属性
名称 说明 IsEnabled
如果应用程序已配置为使用窗体身份验证,则返回true。
GetAuthCookie(user, persist)
为指定用户创建身份验证cookie。第2个参数是bool值,如果为true,将创建在当前会话过期 后仍然有效的cookie。使用SetAuthCookie方法的情况更加常见,该方法可以在一个步骤中创建上述cookie并将其添加到响应中。
GetRedirectUrl(user, persist)
返回在查询字符串中指定的重定向URL,在用户完成身份验证后,应将其返回到该URL。
RedirectFromLoginPage(user, persist)
设置身份验证cookie,并重定向浏览器以返回在查询字符串中指定的用于请求身份 验证的URL。
RedirectToLoginPage()
将浏览器重定向到loginUrl配置特性指定的URL。
SetAuthCookie(user, persist)
为指定用户创建身份验证cookie并将其添加到结果中。第2个参数指定cookie是否能够在会话 期间持续有效。
SignOut()
从响应中删除身份验证cookie,意味着浏览器随后提出的请求将不能通过身份验证(严格来讲,此方法并不会删除cookie ——它以1999年为过期日期新建身份验证cookie,这样,浏览器就不会在随后的请求中包括该cookie)。
-
IPrinciple 接口定义的成员
名称 说明 Identity
返回已通过身份验证的用户的身份,用实现 IIdentity 接口的对象表示
IsInRole(string)
检查是否已为用户分配指定的角色。
? HttpApplication.User 属性还返回一个 IPrinciple 对象,但如果没有与请求关联的对象,它将抛出异常。 一些HttpContext属性会抛出异常,此时应使用与HttpContext对应的属性,后者返回null,而不是抛出异常。
-
IIdentity 接口定义的属性
名称 说明 AuthenticationType
返回一个字符串,表示对用户进行身份验证的机制,对于窗体身份验证,此字符串为Forms。
IsAuthenticated
如果用户已通过身份验证,则返回true。(如果从除HttpContext对象以外的来源收到IIdentity实现对象—— 在多数应用程序中都不会出现这种情况——此属性有很大用处。)
Name
返回当前用户的名称,如果请求未通过身份验证,则返回空字符串("")。
-
roleManager 配置定义的特性
名称 说明 cacheRolesInCookie
如果为true,此特性指定将已分配给用户的角色存储在用作缓存的cookie中,以避免调用角色提供程序。 默认值为false。
cookieName cookiePath cookieProtection cookieRequireSSL cookieSlidingExpiration cookieTimeout cookiePersistentCookie domain
这些特性控制用于缓存角色信息的cookie,并与forms元素定义的类似特性对应。
defaultProvider
指定默认情况下用于执行授权的角色提供程序类的名称
enabled
指定是否启用角色管理。默认值为false。
maxCachedResults
指定在角色cookie中缓存的角色名称的最大数目。默认值为25。
名称 说明 users
指定一个或多个将对其应用add或deny元素的用户。可以使用逗号分隔的名称指定多个用户,使用星号(*)指定所有用户, 或使用问号(?)指定所有未通过身份验证的用户。
roles
指定一个或多个将对其应用add或deny元素的角色。以逗号分隔多个角色。
verbs
将add或deny元素的范围缩小至一个或多个HTTP动词。如果省略,上述元素将适用于所有动词。
如果未匹配任何deny元素,将授权请求。应始终定义一个适用于所有用户或所有未通过身份验证用户的回退deny元素。
不必显式授予由forms.loginUrl特性指定的Web窗体的访问权限。未通过身份验证的请求将自动获得授权。
如果没有任何特定于位置的add和deny元素与请求匹配,则应用基准策略。因此,应始终在特定于位置的策略中放置一个回退deny元素, 以避免访问范围超出预期。
如果存在多个location元素,将首先评估最具体的path值。
项目中只有一个Web.config文件,并且在一个位置定义授权策略,这样理解策略的用途更加容易,也更便于了解某个更改可能造成的影响。
-
成员资格
-
通用提供程序
-
名称不准确,其实支持的产品全部来自Microsoft,其他厂商的提供程序可以另外搜索。
-
Nuget程序包:
-
Microsoft.AspNet.Providers.Core
-
Microsoft.AspNet.Providers.LocalDb
-
-
通用与内置SQL提供程序之间的映射
通用提供程序类 内置SQL提供程序类 System.Web.Providers.DefaultMembershipProvider
System.Web.Security.SqlMembershipProvider
System.Web.Providers.DefaultProfileProvider
System.Web.Profile.SqlProfileProvider
System.Web.Providers.DefaultRoleProvider
System.Web.Security.SqlRoleProvider
System.Web.Providers.DefaultSessionStateProvider
不需要
-
-
Membership 配置元素定义的特性
名称 说明 defaultProvider
默认将用于获取成员资格数据的存储提供程序的名称。
hashAlgorithmType
指定用于在成员资格数据库中存储密码的散列算法。默认值为SHA1,通用提供程序会将此值应用1000次。 内置提供程序不会重复应用散列算法,因而破解密码会较为简单。除非熟悉散列加密,否则不要更改此值。
userIsOnlineTimeWindow
指定在收到请求后仍然视用户在使用应用程序的分钟数。默认值为15。
-
membership/providers/add 配置元素定义的特性
名称 说明 applicationName
单个成员资格数据库可以存储多个应用程序的数据,但可以通过重用相同的applicationName值,在应用程序 之间共享成员资格数据。默认值为 / 。
commandTimeout
设置成员资格提供程序等待SQL数据库响应查询的秒数。默认值为30。
connectionStringName
设置用于连接到数据库的连接字符串的名称。
enablePasswordRetrieval
指定提供程序是否支持密码检索,以便使用 MembershipUser.GetPassword 方法从数据库中读取 密码值。如果密码经过散列处理或加密(参见passwordFormat特性),应将此值设为false(默认值)。
enablePasswordReset
指定是否可以使用 Membership.ResetPassword 方法重置密码。默认值为true。
maxInvalidPasswordAttempts
指定在锁定账户之前允许的最大的身份验证失败数。默认值为5,但通用提供程序会将此值改为10。
minRequiredNonalphanumericCharacters
指定新密码需要的最小非字母数字字符数。默认值为1,但通用提供程序会将此值改 为0。
minRequiredPasswordLength
指定新密码的最小长度。默认值为7,但通用提供程序会将此值更改为6。
passwordAttemptWindow
指定跟踪失败的身份验证尝试的分钟数。每失败一次,都会重置此时长,直到提供正确的凭据或账户被 锁定为止。默认值为10。
passwordFormat
指定System.Web.Security.MembershipPasswordFormat枚举中的值在数据库中存储密码的方式。支持的值 包括Clear(明文形式)、Hashed(散列代码)和Encrypted。默认值为Hashed。
passwordStrengthRegularExpression
指定用于验证新密码的正则表达式。默认值为空字符串(""),即允许任何密码。
requiresQuestionAndAnswer
指定密码重置和恢复是否需要质询问题和答案。默认值为true,但通用提供程序会将此值改为false。
requiresUniqueEmail
指定是否需要使用唯一的电子邮件地址创建每个账户。默认值为true,但通用提供程序会将此值改为false。
-
-
使用 ASP.NET Web Configuration Tool
从VS2013开始,此工具已被移除,可用如下方法打开该工具:
-
打开命令行,导航到.NET的安装目录(例如:C:\Windows\Microsoft.NET\Framework\v4.0.30319 ,.NET Framework版本 不同,路径可能不同),运行以下命令,通过向导创建成员管理数据库。
aspnet_regsql.exe
-
打开命令行(【非】管理员权限),导航到IIS的安装目录(例如:C:\Program Files (x86)\IIS Express ),使用如下命令 启动IIS服务,注意将[port]替换为空闲的端口号。
iisexpress.exe /path:C:\Windows\Microsoft.NET\Framework\v4.0.30319\ASP.NETWebAdminFiles /vpath:/ASP.NETWebAdminFiles /port:[port] /clr:4.0 /ntlm
如果IIS成功启动,命令行会输出一些日志。
-
打开【IE】浏览器,输入如下地址,注意将[port]替换为前一步定义的端口号,将[appPath]替换为包含 *.sln Web.config 文件的物理项目路径(原始路径需进行URL编码后使用)。
http://localhost:[port]/asp.netwebadminfiles/default.aspx?applicationPhysicalPath=[appPath]&applicationUrl=/
如果用其他浏览器打开,会弹出对话框,要求输入用户名和密码。
-
2.1.12. ASP.NET配置
2.1.13. 异步请求处理
2.2. ASP.NET MVC 5
-
Razor 视图引擎
-
声明视图模型对象的类型使用了 @model (首字母小写),而访问 Name 属性使用了 @Model (首字母大写)。
@model Razor.Models.Product ... <div> @Model.Name </div> ...
-
Views 文件夹中以下划线(_)开头的文件不会返回给用户,可以通过文件名来区分要进行渲染的视图和对视图进行支持的文件(例如视图布局文件)。
-
如果视图是自包含的,且不想使用布局,应将 Layout 属性设置为 null 。如果忽略 Layout 属性,MVC 框架将使用视图起始文件(_ViewStart.cshtml)。
-
-
控制器类总是以 Controller 结尾,而在对类进行引用时,要忽略类名的 Controller 部分。
例如:ProductController 在路由配置文件 RouteConfig.cs 中引用时,应使用 Product。
3. Entity Framework
3.1. 连接AS400(通过 DB2 Data Server Client)
-
AS400命令
// 获取服务器的Entry名,填入连接配置字符串中。 // Work with Relational Database Directory Entries WRKRDBDIRE
-
客户端安装
-
准备:
-
Windows:10(64位),7(32位)
-
DB2 Data Server Client(当前最新版为 v11.1 FixPack 2)
-
Visual Studio:2013
-
-
安装前:
-
电脑名不能超过15个英文字符。
-
安装路径中不能有空格,路径不宜过长。
-
建议安装32位版本(因VisualStudio为32位,VSAI只有32位版)。
-
VSAI目前只支持到VS2013,VS2015及之后的版本是否兼容待验证。
-
-
安装时:
-
使用管理员权限运行安装程序。
-
一般选择【典型安装】即可。
-
为学习方便,【禁用】操作系统安全性(关联:DB2管理员组DB2ADMNS,DB2用户组DB2USERS)。
-
-
安装后:
-
打开命令行窗口
db2cmd
-
将授权文件(db2consv_ee.lic)拷贝到命令行的当前路径。
-
追加授权
db2licm -a db2consv_ee.lic
-
(可选)显示授权
db2licm -l
-
连接测试
testconn40 "Database=EntryXXX;User ID=UserXXX;Server=YourIP:446;Persist Security Info=True;password=PwdXXX"
-
-
开发前:
-
Entity Framework Tools(已安装)
-
下载Nuget包:
Install-Package EntityFramework.IBM.DB2
-
-
-
服务器端安装(参照客户端的安装方法)
-
准备:
-
DB2 Data Server Runtime Client
如果在64位操作系统上安装了32位的 DB2 Data Server Runtime Client,需要将IIS应用程序池对应项目的“高级设置-启用32位应用程序”设为True, 否则会报错:“未能加载文件或程序集“IBM.Data.DB2”或它的某一个依赖项。试图加载格式不正确的程序。”
-
-
-
DB2命令
-
验证安装文件、实例和数据库功能
db2val
-
命令帮助
db2 ?
-
SQL 错误代码详情
db2 ? sqlnnnn
-
-
异常处理
-
安装 .NET Framework 安全补丁后,应用加载时报错:
ERROR - DB2.NET Factory lookup failed ... DbProviderFactories section can only appear once per config file ...
解决方法如下:
-
打开“C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\Machine.Config”文件,搜索“DbProviderFactories”:
<system.data> <DbProviderFactories> <add name=... /> <add name=... /> </DbProviderFactories> <DbProviderFactories/> </system.data>
将“<DbProviderFactories/>”这一行删除,保存、退出。
-
确认“C:\Windows\Microsoft.NET\Framework\v2.0.50727\Config\Machine.Config”文件中是否也有多余的行,如有则删除。
-
-
3.2. AS400端数据准备
-
AS400中的对象文件(例如PF)必须是 Unique 的,且开启 Journal。
-
增加journal:
CRTJRNRCV JRNRCV(YOURLIB/JRNRCV01) TEXT('JOURNAL RECEIVER 01') CRTJRN JRN(YOURLIB/JRN01) JRNRCV(YOURLIB/JRNRCV01) STRJRNPF FILE(YOURLIB/YOURFILE) JRN(YOURLIB/JRN01)
-
生成自增列:
** CREATED BY DDS FIRST, THEN ALTER BY SQL STATEMENT ** ALTER TABLE #YourLib/#YourPF ALTER COLUMN ** OPUNID SET GENERATED ALWAYS AS IDENTITY ** ( START WITH 1, INCREMENT BY 1, CYCLE, ** MINVALUE 1 ) A OPUNID 9S 0 COLHDG('UNIQUE IDENTITY')
-
3.3. 技巧和知识点
-
debug时,将EF(6.0+)生成的SQL语句打印到输出窗口中可使用如下代码:
db.Database.Log = s => System.Diagnostics.Debug.WriteLine(s);
4. 依赖注入
4.1. Ninject
-
常用条件绑定
方法
效果
When(谓词)
当谓词(一个 lambda 表达式)的结果为 true 时,实施绑定
WhenClassHas<T>()
当被注入的类以注解属性进行注释,而其类型为 T 时,实施绑定
WhenInjectedInto<T>()
当要被注入的类是类型 T 时,实施绑定
-
常用作用域方法
名称
效果
InTransientScope()
与未指定作用域效果相同,为每一个被解析的依赖项创建一个新的对象(每依赖项一实例)
InSingletonScope()
ToConstant(object)创建一个单一实例,使其共享于整个应用程序。如果使用 InSingletonScope ,或者为 Ninject 提供 ToConstant 方法,Ninject 便会创建这种实例(每应用一实例)
InThreadScope()
创建一个单一实例,将其用于解析一个线程中各个对象的依赖项(每线程一实例)
InRequestScope()
创建一个单一实例,用于解析一个 HTTP 请求中各个对象的依赖项(每请求一实例)