关于asp.net core中的Dependency Injection的介绍参见https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection
其实本文思路很简单,就是在StartUp.ConfigureServices把ORM(这里用的是EF)注入,然后再把业务类注入,使用的时候从Controller中获取业务类对象使用即可。这种场景适合多种数据库,只需在StartUp.ConfigureServices中要怕appsetting.json的配置来确定注入什么样的ORM或数据连接,和什么样的实现业务子类就可以,还是来看五代码实现吧。
1、首先这义业务模块的操作接口和类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
/// <summary>
/// 用户操作接口
/// </summary>
public
interface
IUserRepository
{
/// <summary>
/// 添加用户
/// </summary>
/// <param name="userName">用户名</param>
/// <param name="password">用户密码</param>
void
AddUser(
string
userName,
string
password);
/// <summary>
/// 查询全部用户
/// </summary>
/// <param name="mark"></param>
/// <returns></returns>
List<User> GetAllUsers();
}
/// <summary>
/// SQL Server Entity Framework实现的用户管理类型
/// </summary>
public
class
UserRepository : IUserRepository
{
/// <summary>
/// 数据库实体
/// </summary>
readonly
PermissionContext _db;
/// <summary>
/// 用户管理构造
/// </summary>
/// <param name="db">StartUp.ConfigureServices依赖注入的数据库Context</param>
public
UserRepository(PermissionContext db)
{
_db = db;
}
/// <summary>
/// 添加用户
/// </summary>
/// <param name="userName">用户名</param>
/// <param name="password">用户密码</param>
public
void
AddUser(
string
userName,
string
password)
{
_db.Users.Add(
new
BeginDemo.User() { UserName = userName, Password = password });
_db.SaveChanges();
}
/// <summary>
/// 查询全部用户
/// </summary>
/// <returns></returns>
public
List<User> GetAllUsers()
{
return
_db.Users.ToList();
}
}
|
也可以定义另外的实现IUserRepository接口的子类,来分离不同ORM的实现。
2、接着在StartUp.ConfigureServices中添加注入(ORM注放和业务类注入)
1
2
3
4
5
|
//添加EF对象
services.AddDbContext<PermissionContext>(options => options.UseSqlServer(Configuration.GetConnectionString(
"DefaultConnection"
)));
//添加用户操作对象,可以在这里切换注入的子类(不同的子类实现不同数据库或ORM操作)
services.AddSingleton<IUserRepository, UserRepository>();
|
关于EF在asp.net core的应用,请参照:http://axzxs.blog.51cto.com/730810/1894317
3、接下来就可以很快乐的在Controller中使用业务模块了:
1
2
3
4
5
6
7
8
9
10
11
12
|
public
class
HomeController : Controller
{
readonly
IUserRepository _userRep;
public
HomeController(IUserRepository userRep)
{
_userRep = userRep;
}
public
IActionResult Index()
{
return
View(_userRep.GetAllUsers());
}
}
|
当ORM发生变化时,HomeController和View是不变的,因为这里使用的是IUserRepository接口,利用依赖倒转的原则降低模块的耦合,提升了程序的扩展性。
代码参考:https://github.com/axzxs2001/Asp.NetCoreExperiment
本文转自桂素伟51CTO博客,原文链接:http://blog.51cto.com/axzxs/1895227 ,如需转载请自行联系原作者