前言

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

正文

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. svn Server sent unexpected return value (403 Forbidden) in response to CHECKOUT

    今天,提交資料到公司svn服務器,但是一直提示 Server sent unexpected return value (403 Forbidden) in response to CHECKOUT ...

  2. goquery 添加header 发起请求

    goquery 添加header 发起请求 我们知道使用net/http 很容易发起GET or POST 请求:并且在发起http请求时候,可以很容易的对header进行干预 例如: client ...

  3. centos 7查看防火墙报错(已解决,之前安装过python3)

    [root@localhost ~]# service firewalld restartRedirecting to /bin/systemctl restart firewalld.service ...

  4. LruCache的使用及原理

    采用LRU算法实现的话就是将最老的数据删掉.利用LRU缓存,我们能够提高系统的性能.   一,是它本身已经实现了按照访问顺序的存储,也就是说,最近读取的会放在最前面,最不常读取的会放在最后(当然,它也 ...

  5. Visual Studio Live Share不完全指北

    Visual Studio Live Share是什么? 是VS的一个实时协作开发的扩展工具. github地址:https://github.com/MicrosoftD...文档地址:https: ...

  6. Ubuntu 下命令安装 Java

    1. 使用 java -version 查看系统是否存在 jdk. 2. ubuntu使用的是openjdk,所以我们需要先找到合适的jdk版本.在命令行中输入命令:apt-cache search ...

  7. java反射机制,以及对反射机制的了解,如有差池欢迎点评(初学者勿喷)

    本人学习java时间不长,但是对java很感兴趣,知道有博客园这个平台果断的注册,记录我的java成长日记,这也是我的处女作,虽然很菜但是还是希望大家能见证我的成长,觉得可以的可以和我讨论一起学习 在 ...

  8. Asp.Net MVC 中JS通过ajaxfileupload上传图片获取身份证姓名、生日、家庭住址等详细信息

    客户要求用身份证图片上传获取身份证的详细信息就下来研究了一下(现在的客户真的懒 身份证信息都懒得输入了哈哈...),经过慢慢研究,果然皇天不负有心人搞出来了.这个借助的是腾讯的一个SKD  腾讯优图云 ...

  9. RNN(Recurrent Neural Network)的几个难点

    1. vanish of gradient RNN的error相对于某个时间点t的梯度为: \(\frac{\partial E_t}{\partial W}=\sum_{k=1}^{t}\frac{ ...

  10. 微信小程序 bug及解决方案

    1.小程序遮罩滚动穿透问题 解决方案: <view class="mask" wx:if="{{showVipRights}}" catchtap='hi ...