.NETCore+EF+MySql+Autofac简单三层架构
前言
其实就是一个简单依赖注入的三层架构。记录一下,大佬们就不用看下去了。重点在最后面,可以直接拖到底去看。
正文
1、贴代码
1、整体的一个结构。大佬们应该一眼就看明白了。
2、MySqlContext
using Model;
using Microsoft.EntityFrameworkCore;
namespace DbFactory
{
public class MySqlContext : DbContext
{
public MySqlContext(DbContextOptions<MySqlContext> options)
: base(options)
{
}
public DbSet<Class> Class { get; set; }
}
}
3、IBaseRepository.cs
using System;
using System.Linq;
using System.Linq.Expressions;
namespace IRepository
{
public interface IBaseRepository<T, TKey> : IDisposable where T : class
{
T Find(TKey id);
T Find(Expression<Func<T, bool>> wherelamb);
void Add(T entity, bool isSaveChage = true);
bool Update(T entity, bool isSaveChage = true);
bool Delete(T entity, bool isSaveChage = true);
int Delete(params int[] ids);
IQueryable<T> LoadEntities(Expression<Func<T, bool>> whereLambda);
IQueryable<T> LoadPageEntities<S>(int pageSize, int pageIndex, out int total, Expression<Func<T, bool>> whereLambda, Expression<Func<T, S>> orderbyLambda, bool isAsc);
int SaveChange();
}
}
4、IClassRepository.cs
using Model;
namespace IRepository
{
public interface IClassRepository : IBaseRepository<Class, int>
{
}
}
5、IBaseService.cs
using IRepository;
namespace IService
{
public interface IBaseService<T, TKey> : IBaseRepository<T, TKey> where T : class
{
}
}
6、IClassService.cs
using Model;
using System;
namespace IService
{
public interface IClassService : IBaseService<Class, int>
{
}
}
7、BaseRepository.cs
using DbFactory;
using IRepository;
using Microsoft.EntityFrameworkCore;
using System;
using System.Linq;
using System.Linq.Expressions;
namespace Repository
{
public class BaseRepository<T, TKey> : IBaseRepository<T, TKey> where T : class
{
private MySqlContext _context;
protected bool disposedValue;
public BaseRepository(MySqlContext context)
{
_context = context;
}
public T Find(TKey id)
{
return _context.Set<T>().Find(id);
}
public T Find(Expression<Func<T, bool>> wherelamb)
{
return _context.Set<T>().AsNoTracking().FirstOrDefault();
}
public virtual bool Update(T entity, bool isSaveChage = true)
{
_context.Entry(entity).State = EntityState.Modified;
if (isSaveChage)
{
SaveChange();
}
return true;
}
public virtual bool Delete(T entity, bool isSaveChage = true)
{
_context.Entry(entity).State = EntityState.Deleted;
if (isSaveChage)
{
SaveChange();
}
return true;
}
public virtual int Delete(params int[] ids)
{
foreach (var item in ids)
{
var entity = _context.Set<T>().Find(item);
_context.Set<T>().Remove(entity);
}
SaveChange();
return ids.Count();
}
public IQueryable<T> LoadEntities(Expression<Func<T, bool>> whereLambda)
{
return _context.Set<T>().Where(whereLambda).AsQueryable();
}
public IQueryable<T> LoadPageEntities<S>(int pageSize, int pageIndex, out int total, Expression<Func<T, bool>> whereLambda, Expression<Func<T, S>> orderbyLambda, bool isAsc)
{
total = _context.Set<T>().Where(whereLambda).Count();
if (isAsc)
{
return
_context.Set<T>()
.Where(whereLambda)
.OrderBy(orderbyLambda)
.Skip(pageSize * (pageIndex - 1))
.Take(pageSize)
.AsQueryable();
}
else
{
return
_context.Set<T>()
.Where(whereLambda)
.OrderByDescending(orderbyLambda)
.Skip(pageSize * (pageIndex - 1))
.Take(pageSize)
.AsQueryable();
}
}
protected virtual void Dispose(bool disposing)
{
if (!disposedValue)
{
if (disposing)
{
_context?.Dispose();
}
disposedValue = true;
}
}
public void Dispose()
{
Dispose(true);
}
public void Add(T entity, bool isSaveChage = true)
{
_context.Set<T>().Add(entity);
if (isSaveChage)
{
SaveChange();
}
}
public int SaveChange()
{
return _context.SaveChanges();
}
}
}
8、ClassRepository
using DbFactory;
using IRepository;
using Model;
namespace Repository
{
public class ClassRepository : BaseRepository<Class, int>, IClassRepository
{
private MySqlContext _context;
public ClassRepository(MySqlContext Dbcontext) : base(Dbcontext)
{
_context = Dbcontext;
}
}
}
9、BaseService
using IRepository;
using IService;
using System;
using System.Linq;
using System.Linq.Expressions;
namespace Service
{
public class BaseService<T, TKey> : IBaseService<T, TKey> where T : class
{
private readonly IBaseRepository<T, TKey> _repository;
public BaseService(IBaseRepository<T, TKey> repository)
{
_repository = repository;
}
public T Find(TKey id)
{
return _repository.Find(id);
}
public T Find(Expression<Func<T, bool>> wherelamb)
{
return _repository.Find(wherelamb);
}
public IQueryable<T> LoadEntities(Expression<Func<T, bool>> whereLambda)
{
return _repository.LoadEntities(whereLambda);
}
public IQueryable<T> LoadPageEntities<S>(int pageSize, int pageIndex, out int total, Expression<Func<T, bool>> whereLambda, Expression<Func<T, S>> orderbyLambda, bool isAsc)
{
return _repository.LoadPageEntities(pageSize, pageIndex, out total, whereLambda, orderbyLambda, isAsc);
}
public int SaveChange()
{
return _repository.SaveChange();
}
public bool Update(T entity, bool isSaveChage = true)
{
return _repository.Update(entity, isSaveChage);
}
public void Add(T entity, bool isSaveChage = true)
{
_repository.Add(entity, isSaveChage = true);
}
public bool Delete(T entity, bool isSaveChage = true)
{
return _repository.Delete(entity, isSaveChage);
}
public int Delete(params int[] ids)
{
return _repository.Delete(ids);
}
public void Dispose()
{
_repository.Dispose();
}
}
}
10、ClassService
using IRepository;
using IService;
using Model;
namespace Service
{
public class ClassService : BaseService<Class, int>, IClassService
{
private readonly IClassRepository _repository;
public ClassService(IClassRepository repository) : base(repository)
{
_repository = repository;
}
}
}
11、DBExtensions
using DbFactory;
using Repository;
using Autofac;
using Autofac.Extensions.DependencyInjection;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
namespace Service
{
public static class DBExtensions
{
public static IHostBuilder UseMySql(this IHostBuilder hostBuilder, string connectionString = "")
{
try
{
if (string.IsNullOrEmpty(connectionString))
{
//TODO:连接字符串从Zookeeper
//connectionString = Core.Configs.Get<string>("Connection.MySql");
connectionString = "Server=192.168.1.179;User ID=root;Password=root;Database=db1;";
}
return hostBuilder.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureServices((ctx, services) =>
{
services.AddDbContext<MySqlContext>(options => options.UseMySql(connectionString, b => b.MigrationsAssembly("Test")));
})
.ConfigureContainer<ContainerBuilder>((context, builder) =>
{
builder.RegisterAssemblyTypes(typeof(BaseRepository<,>).Assembly)
.Where(t => t.Name.EndsWith("Repository"))
.AsImplementedInterfaces();
builder.RegisterAssemblyTypes(typeof(BaseService<,>).Assembly)
.Where(t => t.Name.EndsWith("Service"))
.AsImplementedInterfaces();
});
}
catch (System.Exception ex)
{
throw;
}
}
public static IServiceProvider UseMySql(this IServiceCollection services, string connectionString = "")
{
if (string.IsNullOrEmpty(connectionString))
{
//TODO:连接字符串从Zookeeper
//connectionString = Core.Configs.Get<string>("Connection.MySql");
}
connectionString = "Server=192.168.1.179;User ID=root;Password=root;Database=db1;";
services.AddDbContext<MySqlContext>(options =>
options.UseMySql(connectionString, b => b.MigrationsAssembly("Test")));
var builder = new ContainerBuilder();
builder.Populate(services);
builder.RegisterAssemblyTypes(typeof(BaseRepository<,>).Assembly)
.Where(t => t.Name.EndsWith("Repository"))
.AsImplementedInterfaces();
builder.RegisterAssemblyTypes(typeof(BaseService<,>).Assembly)
.Where(t => t.Name.EndsWith("Service"))
.AsImplementedInterfaces();
return new AutofacServiceProvider(builder.Build());
}
}
}
2、调用
控制台
新建控制台程序TestConsoleApp
1、Program
using Service;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
namespace TestConsoleApp
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
CreateDefaultHost(args).Build().Run();
}
static IHostBuilder CreateDefaultHost(string[] args) => new HostBuilder()
.ConfigureServices((ctx, services) =>
{
services.AddHostedService<TestService>();
})
.UseMySql(); //就这样引用一下就好了
}
}
2、TestService
using IService;
using Microsoft.Extensions.Hosting;
using System;
using System.Threading;
using System.Threading.Tasks;
namespace TestConsoleApp
{
internal class TestService : IHostedService, IDisposable
{
IClassService _classService;
public TestService(IClassService classService)
{
_classService = classService;
}
private Timer _timer;
public Task StartAsync(CancellationToken cancellationToken)
{
Console.WriteLine("starting.");
_timer = new Timer(DoWork, null, TimeSpan.Zero,
TimeSpan.FromSeconds(5));
return Task.CompletedTask;
}
private void DoWork(object state)
{
Console.WriteLine("-------------------------------");
var s = _classService.Find(x => true).Id;
Console.WriteLine(s);
Console.WriteLine("working.");
}
public void Dispose()
{
_timer?.Dispose();
}
public Task StopAsync(CancellationToken cancellationToken) => throw new NotImplementedException();
}
}
3、RUN
每5秒就会查询一次。
WEB
这里就不演示了,这样services.UseMySql()就可以了。
using Service;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System;
重点
那就是DBExtensions
关于Autofac的使用,网上大多都是这样的。
但是我要使用IHostBuilder的扩展。改成这样就好了。
.NETCore+EF+MySql+Autofac简单三层架构的更多相关文章
- 基于EF+WCF的通用三层架构及解析
分享基于EF+WCF的通用三层架构及解析 本项目结合EF 4.3及WCF实现了经典三层架构,各层面向接口,WCF实现SOA,Repository封装调用,在此基础上实现了WCFContext,动态服务 ...
- Net系列框架-Dapper+简单三层架构
Net系列框架-Dapper+简单三层架构 工作将近6年多了,工作中也陆陆续续学习和搭建了不少的框架,后续将按由浅入深的方式,整理出一些框架源码,所有框架源码本人都亲自调试通过,如果有问题,欢迎联系我 ...
- Spring Boot demo系列(二):简单三层架构Web应用
2021.2.24 更新 1 概述 这是Spring Boot的第二个Demo,一个只有三层架构的极简Web应用,持久层使用的是MyBatis. 2 架构 一个最简单的Spring Boot Web应 ...
- 分享基于EF+WCF的通用三层架构及解析
本项目结合EF 4.3及WCF实现了经典三层架构,各层面向接口,WCF实现SOA,Repository封装调用,在此基础上实现了WCFContext,动态服务调用及一个分页的实例. 1. 项目架构图: ...
- Asp.Net MVC简单三层架构(MVC5+EF6)
三层架构与MVC的关系 三层架构是一个分层式的软件体系架构设计,分为:表现层(UI).业务逻辑层(BLL).数据访问层(DAL).分层的目的是为了实现“高内聚,低耦合”的思想,有利于系统后期的维护.更 ...
- NetCore +EF+Mysql 从数据库生成实体类到项目
1.点击“工具”->“NuGet包管理器”->“程序包管理器控制台” 分别安装以下几个包 Mysql 版本: Install-Package MySql.Data.EntityFramew ...
- Unity V3 初步使用 —— 为我的.NET项目从简单三层架构转到IOC做准备
[声明]由于本人表达能力有限,为避免不必要的误人子弟,本文将不会涉及IOC与DI,仅仅描述新版本Unity 3的使用(非Unity 3D,如果您想看的是Unity 3D请立即离开,否则莫怪此处“谋财害 ...
- MVC项目实践,在三层架构下实现SportsStore-01,EF Code First建模、DAL层等
SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...
- C#简单三层结构设计UI、BLL、DAL、Model实际项目应用例子
C#简单三层结构设计UI.BLL.DAL .Model实际项目应用例子 在实际项目中,程序设计都有他的层次结构,比如MVC.MVP.普通的三层结构等等,不过现在用三层结构的相比可能少了,但是也有一些小 ...
随机推荐
- WebRTC MCU( Multipoint Conferencing Unit)服务器调研
接触过的有licode.kurento. licode的缺陷:文档支持有限,licode的app client库只有js的 kurento的优势:文档齐全,Demo俱备,封装API比较齐全.它的主要特 ...
- IsNullOrEmpty与IsNullOrWhiteSpace性能比较
IsNullOrEmpty与IsNullOrWhiteSpace性能谁比较高呢? 在string都是空字符串的情况下: IsNullOrWhiteSpace要比IsNullOrEmpty快大约 1~5 ...
- JAVA 第一张 使用记事本编写代码
使用记事本开发JAVA程序的步骤
- JS中sessionstorage的getItem/setItem/removeItem/clear
function people(){ } var animal = { name: "cc", age:16, say:function(m1,m2){ alert("他 ...
- FOF 全面科普贴(转载)
看过那么多 FOF 科普贴,这份最全面!告转之~ 来自:https://xueqiu.com/7692591808/81852994 [ 导言 ] 看过那么多FOF科普贴,这份最全面! 昨天下午,青果 ...
- 分享一下 常用的转换方法(例如:数字转金钱,文本与html互转等)
public sealed class SAFCFormater { /// <summary> /// 文本格式到HTML /// </summary> /// <pa ...
- HTML学习笔记8:表单
什么是表单? 一个网页表单可以将用户输入的数据发送到服务器进行处理.因为互联网用户使用复选框,单选按钮或文本字段填写表格,所以WebForms的形式类似文件或数据库.例如,WebForms ...
- Python零散函数
1. python json.dumps() json.dump()的区别 注意cat ,是直接输出文件的内容 load和loads都是实现"反序列化",区别在于(以Python为 ...
- CXF整合spring
近公司需要弄webservics,还说不用框架整合(提倡使用hessian,他们既然说与操作系统有兼容问题,由于人员单薄,不得不屈服,哎),我想了老半天没弄明白他说的不用框架整合spring,尝试过直 ...
- AXIS2整合spring需要的jar,以及大部分缺少jar所报的异常
axis2 webservice 服务端jar包: -->axis2-kernel-1.6.1.jar -->axis2-spri ...