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

来源:互联网 发布:金域名都公寓价格 编辑:程序博客网 时间:2024/06/05 08:53

一、说明

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简单工厂模式,接口多继承实例

原创粉丝点击