知识点回顾:
在做sqlhelper的单元测试类时,遇到一个地方要配置临时数据库,使用了一个语句来配置。
private DbContextOptions<AppDbContext> _context;
public SqlHelperTests()
{
//使用InMenory数据库配置DBContext
_context = new DbContextOptionsBuilder<AppDbContext>).UseInMemoryDatabase(databaseName: "T_dicomPatientMsg").Options;
}
仔细剖析一个这个长句子
1.泛型类
第一部分为 new DbContextOptionsBuilder<AppDbContext>()
new了一个DbContextOptionsBuilder的泛型类实例
什么是泛型类?
泛型类是类的一种扩展,为了更高的重用性和灵活性。类型参数通常用<T>来标识。
如List<T>就是一个泛型类,可以存储任何类型的元素,如List<int>、List<string>
定义泛型类
public class OptionBuilder<T>{}
还可以限制T泛型,添加泛型约束
public class OptionBuilder<T> where T: TestClass
这样传入的类T,就只能时TestClass的类或它的子类
也可以在调用实例时,限制T的类型
public class OptionBuilder<T>{}
OptionBuilder<T> option = new OptionBuilder<T>() where T: TestClass
使用泛型类的好处
public class Box<T>
{
private T _value;
public Box(T value)
{
_value = value;
}
public T GetValue()
{
return _value;
}
}
// 传Int型
Box<int> intBox = new Box<int>(123);
int value = intBox.GetValue();
//传String
Box<string> stringBox = new Box<string>("nihao");
string value = stringBox.GetValue();
可以传任意类型。
2.扩展方法
第二部分 UseInMemoryDatabase(databaseName: "T_dicomPatientMsg")是一个扩展方法
为什么要用扩展函数
当你完成一个类如TestClass的封装后,如果你需要添加一个新的方法,但是又不想破坏原有类的定义,可以使用扩展方法
扩展方法的定义
首先扩展方法必须是静态方法,它的第一个参数必须是this关键字,标识它要扩展的类
//需要扩展的类
public class TestClass
{
//定义一个实例方法
public void Print(){}
}
//定义扩展方法
public static bool TestClassExtensions
{
public static bool IsNullOrEmpty(this TestClass testClass, string str )
{
return string.IsNullOrEmpty(str);
}
}
//调用扩展方法,扩展方法的调用,其实跟示例方法是一样的,虽然他是静态方法
TestClass testClass = new TestClass();
//调用类内的实例方法
test.Print();
//调用扩展方法
test.IsNullOrEmpty();
扩展方法的好处:
当无法修改现有的代码时,可以使用扩展方法
保持类的简洁
注意:不要滥用扩展方法,且不要跟类内的实例方法存在命名冲突
3.属性和方法
.Options ,这里是调用了DbContextOptionsBuilder类内的Options属性,该属性里设置了get 访问器,可以返回配置类的实例
其实这里使用属性或者方法都是可以的,举例
//使用属性
public class TestClass
{
private Config _config;
public string Options{ get {retrun _config};}
}
//使用方法
public class TestClass
{
private Config _config;
public string GetOption()
{
retrun _config;
}
}
使用哪个取决于习惯, 属性一般用于表示数据状态,方法更偏向于操作和行为