C# EF Core 简单工厂模式,接口多继承实例(三)

2024-05-30 22:18

本文主要是介绍C# EF Core 简单工厂模式,接口多继承实例(三),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、说明

1.本实例是基于.Net Core 1.1,EF Core 1.1的代码实例,仅供参考

2.当前版本的EF Core好像还没有提供模型验证,异常跟踪等

二、实体层,自动 生成

三 、接口层

1.基础 接口 

/// <summary>
/// 基础访问接口,使用泛型
/// </summary>
public interface IBaseAbstract<T> where T : class
{#region 基础访问/// <summary>/// 获取表达树/// </summary>/// <returns></returns>DbSet<T> GetDbSet();/// <summary>/// 根据主键 获取对象/// </summary>/// <param name="id"></param>/// <returns></returns>T GetModel(object id);/// <summary>/// 添加对象/// </summary>/// <param name="model">实例对象</param>/// <returns></returns>bool Add(T model);/// <summary>/// 修改对象/// </summary>/// <param name="model">实例对象</param>/// <returns></returns>bool Modify(T model);/// <summary>/// 删除对象/// </summary>/// <param name="model">实例对象</param>/// <returns></returns>bool Delete(T model);/// <summary>/// 删除 对象/// </summary>/// <param name="id">主键ID</param>/// <returns></returns>bool Delete(object id);#endregion
}
2.业务接口

namespace NotifyBird.Abstract
{/// <summary>/// 消息内容,接口/// </summary>public interface IMessage : IBaseAbstract<Message>{}
}

四、接口实现,实例工厂层

1.基础操作

/// <summary>
/// 基础类型操作
/// 重点实现基础接口中的操作
/// </summary>
internal class BaseOperate<T> where T : class
{public NotifyBirdContext Context = null;public BaseOperate(){Context = new NotifyBirdContext();}#region 其他操作 /// <summary>  /// 保存数据  /// </summary>  /// <returns></returns>  public int Save(){return Context.SaveChanges();}/// <summary>  /// 标间对象为修改状态,并保存  /// </summary>  public bool SetModify<T>(T model) where T : class{Context.Entry<T>(model).State = EntityState.Modified;return Save() > 0;}#endregion#region 基础访问/// <summary>/// 获取表达树/// </summary>/// <returns></returns>public DbSet<T> GetDbSet(){return Context.Set<T>();}/// <summary>/// 根据主键 获取对象/// </summary>/// <param name="id"></param>/// <returns></returns>public T GetModel(object id){return GetDbSet().Find(id);}/// <summary>/// 添加对象/// </summary>/// <param name="model">实例对象</param>/// <returns></returns>public bool Add(T model){try{GetDbSet().Add(model);return Save() > 0;}catch (Exception ex){return Error_Add(ex);}}/// <summary>/// 修改对象/// </summary>/// <param name="model">实例对象</param>/// <returns></returns>public bool Modify(T model){try{return SetModify(model);}catch (Exception ex){return Error_Modify(ex);}}/// <summary>/// 删除对象/// </summary>/// <param name="model">实例对象</param>/// <returns></returns>public bool Delete(T model){try{GetDbSet().Remove(model);return Save() > 0;}catch (Exception ex){return Error_Delete(ex);}}/// <summary>/// 删除 对象/// </summary>/// <param name="id">主键ID</param>/// <returns></returns>public bool Delete(object id){try{T model = GetModel(id);if (model == null)throw new Exception($"获取id={id}的对象失败,当前类型:{model.GetType().Name}");return Delete(model);}catch (Exception ex){return Error_Delete(ex);}}#endregion#region 异常处理  private string GetErrorMsg(Exception ex){StringBuilder builder = new StringBuilder();Exception inner = ex;int i = 0;while (inner != null){i++;builder.AppendFormat("内部原因{0}:{1}", i, ex.Message);builder.AppendLine();inner = inner.InnerException;}return builder.ToString();}/// <summary>  /// 添加数据异常  /// </summary>  /// <param name="ex"></param>  /// <returns></returns>  public bool Error_Add(Exception ex){throw new Exception("添加数据失败," + GetErrorMsg(ex));}/// <summary>  /// 修改数据异常  /// </summary>  /// <returns></returns>  public bool Error_Modify(Exception ex){throw new Exception("修改数据失败," + GetErrorMsg(ex));}/// <summary>  /// 删除数据异常  /// </summary>  public bool Error_Delete(Exception ex){throw new Exception("删除数据失败," + GetErrorMsg(ex));}#endregion
}

2.业务操作

    /// <summary>/// 消息内容,数据访问操作/// </summary>internal class MessageOperate : BaseOperate<Message>, IMessage{}

3.实例工厂

注:此处命名空间和接口 相同 ,则在使用 的时候不需要单独引用 Factory

namespace NotifyBird.Abstract
{/// <summary>/// 工厂类 ,用于生产接口实例/// </summary>public class ConcreteFactory{public static IProject GetProject(){return new ProjectOpeate();}public static IMessage GetMessage(){return new MessageOperate();}}
}
更多:

C# EF CodeFirst简单工厂模式,接口多继承实例(二)

C# EF CodeFirst简单工厂模式,接口多继承实例

这篇关于C# EF Core 简单工厂模式,接口多继承实例(三)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1016976

相关文章

关于C++中的虚拟继承的一些总结(虚拟继承,覆盖,派生,隐藏)

1.为什么要引入虚拟继承 虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。如:类D继承自类B1、B2,而类B1、B2都继承自类A,因此在类D中两次出现类A中的变量和函数。为了节省内存空间,可以将B1、B2对A的继承定义为虚拟继承,而A就成了虚拟基类。实现的代码如下: class A class B1:public virtual A; class B2:pu

C# 中变量未赋值能用吗,各种类型的初始值是什么

对于一个局部变量,如果未赋值,是不能使用的 对于属性,未赋值,也能使用有系统默认值,默认值如下: 对于 int 类型,默认值是 0;对于 int? 类型,默认值是 null;对于 bool 类型,默认值是 false;对于 bool? 类型,默认值是 null;对于 string 类型,默认值是 null;对于 string? 类型,哈哈,没有这种写法,会出错;对于 DateTime 类型,默

一份LLM资源清单围观技术大佬的日常;手把手教你在美国搭建「百万卡」AI数据中心;为啥大模型做不好简单的数学计算? | ShowMeAI日报

👀日报&周刊合集 | 🎡ShowMeAI官网 | 🧡 点赞关注评论拜托啦! 1. 为啥大模型做不好简单的数学计算?从大模型高考数学成绩不及格说起 司南评测体系 OpenCompass 选取 7 个大模型 (6 个开源模型+ GPT-4o),组织参与了 2024 年高考「新课标I卷」的语文、数学、英语考试,然后由经验丰富的判卷老师评判得分。 结果如上图所

如何开启和关闭3GB模式

https://jingyan.baidu.com/article/4d58d5414dfc2f9dd4e9c082.html

swiper实例

大家好,我是燐子,今天给大家带来swiper实例   微信小程序中的 swiper 组件是一种用于创建滑动视图的容器组件,常用于实现图片轮播、广告展示等效果。它通过一系列的子组件 swiper-item 来定义滑动视图的每一个页面。 基本用法   以下是一个简单的 swiper 示例代码:   WXML(页面结构) <swiper autoplay="true" interval="3

Java面试题:通过实例说明内连接、左外连接和右外连接的区别

在 SQL 中,连接(JOIN)用于在多个表之间组合行。最常用的连接类型是内连接(INNER JOIN)、左外连接(LEFT OUTER JOIN)和右外连接(RIGHT OUTER JOIN)。它们的主要区别在于它们如何处理表之间的匹配和不匹配行。下面是每种连接的详细说明和示例。 表示例 假设有两个表:Customers 和 Orders。 Customers CustomerIDCus

十四、观察者模式与访问者模式详解

21.观察者模式 21.1.课程目标 1、 掌握观察者模式和访问者模式的应用场景。 2、 掌握观察者模式在具体业务场景中的应用。 3、 了解访问者模式的双分派。 4、 观察者模式和访问者模式的优、缺点。 21.2.内容定位 1、 有 Swing开发经验的人群更容易理解观察者模式。 2、 访问者模式被称为最复杂的设计模式。 21.3.观察者模式 观 察 者 模 式 ( Obser

回调的简单理解

之前一直不太明白回调的用法,现在简单的理解下 就按这张slidingmenu来说,主界面为Activity界面,而旁边的菜单为fragment界面。1.现在通过主界面的slidingmenu按钮来点开旁边的菜单功能并且选中”区县“选项(到这里就可以理解为A类调用B类里面的c方法)。2.通过触发“区县”的选项使得主界面跳转到“区县”相关的新闻列表界面中(到这里就可以理解为B类调用A类中的d方法

自制的浏览器主页,可以是最简单的桌面应用,可以把它当成备忘录桌面应用

自制的浏览器主页,可以是最简单的桌面应用,可以把它当成备忘录桌面应用。如果你看不懂,请留言。 完整代码: <!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><ti