前言

其实就是一个简单依赖注入的三层架构。记录一下,大佬们就不用看下去了。重点在最后面,可以直接拖到底去看。

正文

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简单三层架构的更多相关文章

  1. 基于EF+WCF的通用三层架构及解析

    分享基于EF+WCF的通用三层架构及解析 本项目结合EF 4.3及WCF实现了经典三层架构,各层面向接口,WCF实现SOA,Repository封装调用,在此基础上实现了WCFContext,动态服务 ...

  2. Net系列框架-Dapper+简单三层架构

    Net系列框架-Dapper+简单三层架构 工作将近6年多了,工作中也陆陆续续学习和搭建了不少的框架,后续将按由浅入深的方式,整理出一些框架源码,所有框架源码本人都亲自调试通过,如果有问题,欢迎联系我 ...

  3. Spring Boot demo系列(二):简单三层架构Web应用

    2021.2.24 更新 1 概述 这是Spring Boot的第二个Demo,一个只有三层架构的极简Web应用,持久层使用的是MyBatis. 2 架构 一个最简单的Spring Boot Web应 ...

  4. 分享基于EF+WCF的通用三层架构及解析

    本项目结合EF 4.3及WCF实现了经典三层架构,各层面向接口,WCF实现SOA,Repository封装调用,在此基础上实现了WCFContext,动态服务调用及一个分页的实例. 1. 项目架构图: ...

  5. Asp.Net MVC简单三层架构(MVC5+EF6)

    三层架构与MVC的关系 三层架构是一个分层式的软件体系架构设计,分为:表现层(UI).业务逻辑层(BLL).数据访问层(DAL).分层的目的是为了实现“高内聚,低耦合”的思想,有利于系统后期的维护.更 ...

  6. NetCore +EF+Mysql 从数据库生成实体类到项目

    1.点击“工具”->“NuGet包管理器”->“程序包管理器控制台” 分别安装以下几个包 Mysql 版本: Install-Package MySql.Data.EntityFramew ...

  7. Unity V3 初步使用 —— 为我的.NET项目从简单三层架构转到IOC做准备

    [声明]由于本人表达能力有限,为避免不必要的误人子弟,本文将不会涉及IOC与DI,仅仅描述新版本Unity 3的使用(非Unity 3D,如果您想看的是Unity 3D请立即离开,否则莫怪此处“谋财害 ...

  8. MVC项目实践,在三层架构下实现SportsStore-01,EF Code First建模、DAL层等

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  9. C#简单三层结构设计UI、BLL、DAL、Model实际项目应用例子

    C#简单三层结构设计UI.BLL.DAL .Model实际项目应用例子 在实际项目中,程序设计都有他的层次结构,比如MVC.MVP.普通的三层结构等等,不过现在用三层结构的相比可能少了,但是也有一些小 ...

随机推荐

  1. 推荐 git community book 中文版

    官方地址:http://Git.seyren.com/index.html 或者 http://gitbook.liuhui998.com/ book@github项目地址: https://gith ...

  2. Roundcube Webmail信息泄露漏洞(CVE-2015-5383)

    Preface Software: https://roundcube.net/Versions: 1.1.x<1.1.2(亲测1.1.5也有效)CVE: CVE-2015-5383Author ...

  3. 记一次webpack打包优化

    未进行打包优化的痛点: 随着项目的不断扩大,引入的第三方库会越来越多,我们每次build的时候会对所有的文件进行打包,耗时必定很长,不利于日常开发. 解决思路: 第三方库我们只是引入到项目里来,一般不 ...

  4. redis的持久化之RDB的配置和原理

    Redis优秀的性能是由于其将所有的数据都存储在内存中,同样memcached也是这样做的,内存中的数据会在服务器重启后就没有了,也就是不能保证持久化.但是为什么Redis能够脱颖而出呢,很大程度上是 ...

  5. C# 使用 SmtpClient.SendAsync 方法发送邮件失败,总是返回 Cancelled

    问题: 调用 SmtpClient.SendAsync,在 SendCompleted 的回调函数里面总是获取到 e.Cancelled 为 true. 后来测试了一下,相同的代码,只是把 SmtpC ...

  6. PAT1049:Counting Ones

    1049. Counting Ones (30) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue The tas ...

  7. kvm常见故障及解决

    一.启动虚拟机Connection reset by peer # virsh start vmhost1error: Failed to start domain vmhost1error: Una ...

  8. System.nanoTime理解

    JDK1.5之后java中的计时给出了更精确的方法:System.nanoTime(),输出的精度是纳秒级别,这个给一些性能测试提供了更准确的参考. 但是这个方法有个需要注意的地方,不能用来计算今天是 ...

  9. SSM-SpringMVC-11:SpringMVC中ParameterMethodNameResolver参数方法名称解析器

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 或许曾经的我们也见过一种方式http://localhost:8080/项目名/后台servlet?actio ...

  10. Linux kernel的中断子系统之(六):ARM中断处理过程

    返回目录:<ARM-Linux中断系统>. 总结:二中断处理经过两种模式:IRQ模式和SVC模式,这两种模式都有自己的stack,同时涉及到异常向量表中的中断向量. 三ARM处理器在感知到 ...