摘要:前言大家好,我依旧是你们的老朋友,很高兴又在周五的时候准时和大家见面。如果遇到问题,欢迎加入码友网官方群本文来源码友网一步一步创建程序七
前言
大家好,我依旧是你们的老朋友Rector,很高兴又在周五的时候准时和大家见面。
Rector的系列文章【一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar]】从写作以来,已经出了六期了,其中受到了很多朋友的喜欢,在此非常感谢大家对Rector的支持,也希望Rector的文章可以帮助大家(特别是才接触或者是对.NET/C#高级编程比较薄弱的朋友们)在.NET/C#的开发之旅中更快地提升自己的开发技巧和经验。
上一篇《一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](六)》我们对TsBlog应用程序的仓储层进行了一次重大的重构,即:使用泛型仓储将通用的数据库操作进行了封装,让我们在创建仓储层接口和实现的时候能精简重复的代码,今天要给大家分享的是对服务层的泛型封装和重构,实现原理大致与仓储层相似。
本文知识要点泛型服务层的封装与重构
重构服务层 提取泛型服务基类打开项目【TsBlog.Services】,创建 服务层通用接口类 IService.cs,在其中创建服务层通用的接口方法,如下:
using System; using System.Collections.Generic; using System.Linq.Expressions; namespace TsBlog.Services { ////// 服务接口 /// ///public interface IService { /// /// 根据主值查询单条数据 /// /// 主键值 ///泛型实体 T FindById(object pkValue); ////// 查询所有数据(无分页,请慎用) /// ///IEnumerable FindAll(); /// /// 根据条件查询数据 /// /// 条件表达式树 /// 排序 ///泛型实体集合 IEnumerableFindListByClause(Expression > predicate, string orderBy); /// /// 根据条件查询数据 /// /// 条件表达式树 ///T FindByClause(Expression > predicate); /// /// 写入实体数据 /// /// 实体类 ///long Insert(T entity); /// /// 更新实体数据 /// /// ///bool Update(T entity); /// /// 删除数据 /// /// 实体类 ///bool Delete(T entity); /// /// 删除数据 /// /// 过滤条件 ///bool Delete(Expression > @where); /// /// 删除指定ID的数据 /// /// ///bool DeleteById(object id); /// /// 删除指定ID集合的数据(批量删除) /// /// ///bool DeleteByIds(object[] ids); } }
再创建 泛型基类 GenericService.cs,在其中创建服务层通用的方法,如下:
using System; using System.Collections.Generic; using System.Linq.Expressions; using TsBlog.Repositories; namespace TsBlog.Services { public abstract class GenericService: IService , IDependency where T : class, new() { private readonly IRepository _repository; protected GenericService(IRepository repository) { _repository = repository; } /// /// 根据主值查询单条数据 /// /// 主键值 ///泛型实体 public T FindById(object pkValue) { return _repository.FindById(pkValue); } ////// 查询所有数据(无分页,请慎用) /// ///public IEnumerable FindAll() { return _repository.FindAll(); } /// /// 根据条件查询数据 /// /// 条件表达式树 /// 排序 ///泛型实体集合 public IEnumerableFindListByClause(Expression > predicate, string orderBy) { return _repository.FindListByClause(predicate, orderBy); } /// /// 根据条件查询数据 /// /// 条件表达式树 ///public T FindByClause(Expression > predicate) { return _repository.FindByClause(predicate); } /// /// 写入实体数据 /// /// 实体类 ///public long Insert(T entity) { return _repository.Insert(entity); } /// /// 更新实体数据 /// /// ///public bool Update(T entity) { return _repository.Update(entity); } /// /// 删除数据 /// /// 实体类 ///public bool Delete(T entity) { return _repository.Delete(entity); } /// /// 删除数据 /// /// 过滤条件 ///public bool Delete(Expression > @where) { return _repository.Delete(@where); } /// /// 删除指定ID的数据 /// /// ///public bool DeleteById(object id) { return _repository.DeleteById(id); } /// /// 删除指定ID集合的数据(批量删除) /// /// ///public bool DeleteByIds(object[] ids) { return _repository.DeleteByIds(ids); } } }
精简并修改 IPostService.cs:
using TsBlog.Domain.Entities; using TsBlog.Repositories; namespace TsBlog.Services { public interface IPostService : IDependency, IService{ } }
再精简并修改 PostService.cs:
using TsBlog.Domain.Entities; using TsBlog.Repositories; namespace TsBlog.Services { public class PostService : GenericService, IPostService { private readonly IPostRepository _repository; public PostService(IPostRepository repository) : base(repository) { _repository = repository; } } }
重新编译并按F5运行 【TsBlog.Frontend】Web应用程序,你会看到如下的错误提示:
这是为什么呢?是因为我们之前写好的 PostRepository.cs类中没有继承IPostRepository接口,但我们在 PostService.cs 类中使用了非泛型的 IPostRepository接口,所以在 PostRepository.cs 类中添加 IPostRepository 的接口,此时的 PostRepository.cs :
using TsBlog.Domain.Entities; namespace TsBlog.Repositories { ////// POST表的数据库操作类 /// public class PostRepository : GenericRepository, IPostRepository { } }
最终的 Global.asax.cs :
using Autofac; using Autofac.Features.ResolveAnything; using Autofac.Integration.Mvc; using System; using System.Linq; using System.Web.Mvc; using System.Web.Routing; using TsBlog.AutoMapperConfig; using TsBlog.Repositories; namespace TsBlog.Frontend { public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); //BundleConfig.RegisterBundles(BundleTable.Bundles); AutofacRegister(); AutoMapperRegister(); } private void AutofacRegister() { var builder = new ContainerBuilder(); //注册MvcApplication程序集中所有的控制器 builder.RegisterControllers(typeof(MvcApplication).Assembly); //注册仓储层服务 //builder.RegisterType().As (); //注册基于接口约束的实体 var assembly = AppDomain.CurrentDomain.GetAssemblies(); builder.RegisterAssemblyTypes(assembly) .Where( t => t.GetInterfaces() .Any(i => i.IsAssignableFrom(typeof(IDependency))) ) .AsImplementedInterfaces() .InstancePerDependency(); //builder.RegisterGeneric(typeof(GenericRepository<>)) // .As(typeof(IRepository<>)); //builder.RegisterGeneric(typeof(GenericService<>)) // .As(typeof(IService<>)); //builder.RegisterGeneric(typeof(GenericRepository<>)); //builder.RegisterGeneric(typeof(GenericService<>)); //注册服务层服务 //builder.RegisterType ().As (); //注册过滤器 builder.RegisterFilterProvider(); builder.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource()); var container = builder.Build(); //设置依赖注入解析器 DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); } /// /// AutoMapper的配置初始化 /// private void AutoMapperRegister() { new AutoMapperStartupTask().Execute(); } } }
再次按F5运行,打开页面[http://localhost:54739/home/post ],页面又回来了,哈哈。。。
本文的源码托管地址:https://github.com/lampo1024/...
本文学习到此结束,本系列未完待续,我们下期再见……
如果你喜欢Rector的本系列文章,请为我点个大大的赞。
如果遇到问题,欢迎加入码友网官方QQ群:483350228
本文来源 码友网 《一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](七)》
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/110498.html
摘要:开发人员需要作的事则是通过配置两个实体对象之间的一些映射关系。提供了一些简单配置,还有一些简单的映射测试。所以,再在解决方案目录下创建一个名为的项目,这个项目只存放关于视图实体的类文件。本文同步发表至码友网一步一步创建程序五 前言 Hi,大家好,我是Rector 时间飞逝,一个星期又过去了,今天还是星期五,Rector在码友网继续跟大家分享系列文本:一步一步创建ASP.NET MVC5...
摘要:我们新建页面时只需要基于这个母版页,就会自动继承母版页面的通用布局部分,比如头部导航菜单栏页面底部信息等等。那么现在就把本示例中的头部导航页脚区域作为共用区域提取出来,放到母版页中。但是请注意,一个母版页中只能有一个标记。 前言 朋友们,大家好,我还是Rector,写ASP.NET MVC 5系列文章 [一步一步创建ASP.NET MVC5程序Repository+Autofac+Au...
摘要:前言上一篇一步一步创建程序三,我们完成了引用使用对类的改造并成功使用来查询到了数据,今天我们来创建一个新的服务层以及安装配置依赖注入框架组件等。项目创建成功后,删除自动生成的文件。本文同步发表至码友网一步一步创建程序四 前言 上一篇《一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](三)》,我们完成了: * 引用S...
摘要:今天我们就引入一个国内开发者开发并维护的开源框架。本文同步发表至码友网一步一步创建程序三 前言 上一篇《一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](二)》我们通过如下操作: 创建实体及工具类 创建Repository类 完善View层 修改控制器 创建视图 数据库连接 创建数据库和表 实现了简单的...
摘要:在码友网又和大家见面啦上一篇一步一步创建程序五我们完成了是什么简述安装的配置的应用通过前面几篇文章的学习,本系列一步一步创建程序中主要涉及到的技术和组件已基本介绍到位了。本文来源码友网一步一步创建程序六 前言 大家好,我是Rector 又是星期五,很兴奋,很高兴,很high...啦啦啦。。。Rector在码友网又和大家见面啦!!!上一篇《一步一步创建ASP.NET MVC5程序[Rep...
阅读 504·2021-11-16 11:44
阅读 1687·2021-09-10 10:50
阅读 899·2019-08-27 11:05
阅读 3437·2019-08-26 12:13
阅读 3127·2019-08-26 10:46
阅读 2215·2019-08-23 12:37
阅读 1023·2019-08-22 18:30
阅读 2398·2019-08-22 17:30