書接上文,上文寫了個(gè)簡單的.net core api程序創(chuàng)建流程,今天來寫一下簡單項(xiàng)目搭建步驟。
一.Autofac反射程序集方式服務(wù)注冊(cè)
我們這里還是使用Autofac容器,具體使用教程可參考文章《.NET Core基礎(chǔ)知識(shí)-依賴注入(Autofac)》這篇文章介紹的比較詳細(xì)了。下面我說一下在.net core6里是怎么創(chuàng)建注入的。
1、Autofac在.net core6里依賴注入
1.1 先導(dǎo)入包
1.2 在Program中反射程序集方式服務(wù)注冊(cè)Autofac
#region Autofac程序集注入
//添加Autofac容器
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
//builder.Host.ConfigureContainer<ContainerBuilder>(container => { container.RegisterType<LoginServices>().As<ILoginServices>(); });
//builder.Host.ConfigureContainer<ContainerBuilder>(container => { container.RegisterType<LoginRepositorys>().As<ILoginRepositorys>(); });
//.net core6 Autofac程序集掃描注入
Assembly service = Assembly.Load("Services");
Assembly repository = Assembly.Load("Repositorys");
builder.Host.ConfigureContainer<ContainerBuilder>(container =>
{
container.RegisterAssemblyTypes(service, repository).Where(t => t.Name.EndsWith("Services"))
.AsImplementedInterfaces();
});
builder.Host.ConfigureContainer<ContainerBuilder>(container =>
{
container.RegisterAssemblyTypes(service, repository).Where(t => t.Name.EndsWith("Repositorys"))
.AsImplementedInterfaces();
});
//早期.net core Autofac程序集掃描注入
//public void ConfigureContainer(ContainerBuilder builder)
//{
// Assembly service = Assembly.Load("Services");
// Assembly repository = Assembly.Load("Repository");
// //containerBuilder.RegisterAssemblyTypes(service).AsImplementedInterfaces().InstancePerDependency();
// builder.RegisterAssemblyTypes(service, repository).Where(t => t.Name.EndsWith("Service"))
// .AsImplementedInterfaces();
// builder.RegisterAssemblyTypes(service, repository).Where(t => t.Name.EndsWith("Repository"))
// .AsImplementedInterfaces();
//}
#endregion
通過掃描程序集注入,我們可以達(dá)到避免一條一條注入的煩惱,這個(gè)功能也比較實(shí)用。
二.Freesql在.net core6中的使用
2.1 先導(dǎo)入包
2.1 在Program中依賴注入
#region Freesql注入
Func<IServiceProvider, IFreeSql> fsqlFactory = r =>
{
IFreeSql fsql = new FreeSql.FreeSqlBuilder()
.UseConnectionString(FreeSql.DataType.SqlServer, r.GetService<IConfiguration>()["ConnectionStrings:CloudDB"])
.UseMonitorCommand(cmd => Console.WriteLine($"Sql:{cmd.CommandText}"))//監(jiān)聽SQL語句
.UseAutoSyncStructure(true) //自動(dòng)同步實(shí)體結(jié)構(gòu)到數(shù)據(jù)庫,F(xiàn)reeSql不會(huì)掃描程序集,只有CRUD時(shí)才會(huì)生成表。
.Build();
return fsql;
};
builder.Services.AddSingleton<IFreeSql>(fsqlFactory);
#endregion
var app = builder.Build();
//在項(xiàng)目啟動(dòng)時(shí),從容器中獲取IFreeSql實(shí)例,并執(zhí)行一些操作:同步表,種子數(shù)據(jù),FluentAPI等
using (IServiceScope serviceScope = app.Services.CreateScope())
{
var fsql = serviceScope.ServiceProvider.GetRequiredService<IFreeSql>();
//fsql.CodeFirst.SyncStructure(typeof(Topic));//Topic 為要同步的實(shí)體類//同步實(shí)體類到數(shù)據(jù)庫
}
數(shù)據(jù)庫鏈接寫在了appsettings.json中,注入的話可以直接抄官方文檔
Func<IServiceProvider, IFreeSql> fsql = r =>
{
IFreeSql fsql = new FreeSql.FreeSqlBuilder()
.UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=freedb.db")//@"Data Source=freedb.db"這里可以直接寫數(shù)據(jù)庫鏈接語句,如果想寫在appsettings.json中的話,可以看下上面我的那種寫法。
.UseMonitorCommand(cmd => Console.WriteLine($"Sql:{cmd.CommandText}"))//監(jiān)聽SQL語句
.UseAutoSyncStructure(true) //自動(dòng)同步實(shí)體結(jié)構(gòu)到數(shù)據(jù)庫,F(xiàn)reeSql不會(huì)掃描程序集,只有CRUD時(shí)才會(huì)生成表。
.Build();
return fsql;
};
services.AddSingleton<IFreeSql>(fsql);
三.架構(gòu)分成
3.1 Models層
這一層就是實(shí)體類,我這里使用的是Freesql,實(shí)體類配置可查閱官方文檔(也可以使用SQLSugar),這兩種我比較常用。
3.2 LoginRepositorys層
這一層是用于數(shù)據(jù)處理,里面分兩個(gè)文件夾,IRepositorys接口層和Repositorys實(shí)現(xiàn)層。具體用法如下:
//IRepositorys接口層
public interface ILoginRepositorys
{
Task<int> Login(string Account,string Password);
}
//Repositorys實(shí)現(xiàn)層
public class LoginRepositorys : ILoginRepositorys
{
private readonly IFreeSql _fsql;
public LoginRepositorys(IFreeSql fsql)
{
this._fsql = fsql;
}
//登錄查詢
public async Task<int> Login(string Account, string Password)
{
var curd = (await _fsql.Select<UserInfo>().Where(x => x.Account == Account && x.Password == Password).ToListAsync()).Count();
return curd;
}
}
3.3 Services層
這層就是來寫業(yè)務(wù)了,里面也是分兩個(gè)文件夾,IServices接口層和Services實(shí)現(xiàn)層。具體用法如下:
//IServices接口層
public interface ILoginServices
{
Task<int> Login(string Account, string Password);
}
//Services實(shí)現(xiàn)層
public class LoginServices : ILoginServices
{
private readonly ILoginRepositorys _loginRepositorys;
public LoginServices(ILoginRepositorys loginRepositorys)
{
this._loginRepositorys = loginRepositorys;
}
//登錄查詢
public async Task<int> Login(string Account, string Password)
{
int Msg = 0;
try
{
if (string.IsNullOrWhiteSpace(Account))
{
throw new Exception("賬號(hào)不能為空!");
}
if (string.IsNullOrWhiteSpace(Password))
{
throw new Exception("密碼不能為空!");
}
if (await _loginRepositorys.Login(Account,Password)> 0)
{
Msg = 1;
}
}
catch (Exception ex)
{
return Msg;
}
return Msg;
}
}
這里我們只需要做業(yè)務(wù)處理即可,如碼所示,當(dāng)我們處理業(yè)務(wù)時(shí)只需要調(diào)用LoginRepositorys層即可,這樣充分展現(xiàn)了高內(nèi)聚、低耦合的設(shè)計(jì),而且后期易于維護(hù),當(dāng)數(shù)據(jù)庫發(fā)生變化時(shí),只需要修改LoginRepositorys層,就不用修改業(yè)務(wù)層了。文章來源:http://www.zghlxwxcb.cn/news/detail-479037.html
3.4 控制器層(API層)
[Route("api/[controller]/[action]")]
[ApiController]
public class HomeController : ControllerBase
{
private readonly ILoginServices _loginServices;
public HomeController(ILoginServices loginServices)
{
this._loginServices = loginServices;
}
[HttpGet]
public string Word()
{
return "Hello Word!";
}
[HttpGet]
public string Login(string account, string password)
{
string Meg = "我是測(cè)試!";
if (account == "admin" && password == "123456")
{
Meg = "測(cè)試成功了!";
}
return Meg;
}
[HttpGet]
public async Task<int> Logins(string Account, string Password)
{
//使用MD5加密
string Passwords = MD5Helper.MD5Encrypt64(Password);
return (await _loginServices.Login(Account, Passwords));
}
}
主要思想:前端—>控制器層(API層)—>Services層—>LoginRepositorys層
目前是寫了個(gè)比較簡單的框架搭建Demo,后續(xù)會(huì)繼續(xù)補(bǔ)充,也會(huì)繼續(xù)開發(fā)別的框架Demo,學(xué)無止境!文章來源地址http://www.zghlxwxcb.cn/news/detail-479037.html
到了這里,關(guān)于.Net Core 6 WebApi 項(xiàng)目搭建(二)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!