<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
        

      C#進階系列——MEF實現設計上的“松耦合”(二)

      前言:前篇 C#進階系列——MEF實現設計上的“松耦合”(一) 介紹了下MEF的基礎用法,讓我們對MEF有了一個抽象的認識。當然MEF的用法可能不限于此,比如MEF的目錄服務、目錄篩選、重組部件等高級應用在這里就不做過多講解,因為博主覺得這些用法只有在某些特定的環境下面才會用到,著實不太普遍,感覺沒有鉆下去的必要。如果你有興趣也可以去了解下。這篇打算將MEF和倉儲模式結合起來談談MEF在項目中的使用。

       

      1、倉儲模式:也叫Repository模式。Repository是一個獨立的層,介于領域層與數據映射層(數據訪問層)之間。它的存在讓領域層感覺不到數據訪問層的存在,它提供一個類似集合的接口提供給領域層進行領域對象的訪問。Repository是倉庫管理員,領域層需要什么東西只需告訴倉庫管理員,由倉庫管理員把東西拿給它,并不需要知道東西實際放在哪。Repository模式一般是用來封裝數據訪問層的,這也就是為什么很多地方看到說的什么“數據倉儲”,大概就是這個意思。Repository模式并不是本文的重點,這里就不再展開,后面會單獨分享這塊。

      關于倉儲模式有以下幾點需要注意:

      (1)Repository模式是架構模式,在設計架構時,才有參考價值;

      (2)Repository模式使用的意義:一是隔離業務邏輯層和底層數據訪問層,保證數據出入口的唯一性;二是Repository模式針對聚合根設計的,而并不是針對表和實體設計的,換句話說,使用Repository是為了實現內聚,前端只負責向Repository請求數據即可,而不用關心數據的具體來源;

      (3)Repository模式實際用途:更換、升級ORM引擎,不影響業務邏輯;

      上面這些東西寫得有點官方。博主的理解是,倉儲模式就是對數據訪問層(或者叫數據映射層)做了一層包裝,每一次前端需要查詢什么數據或者提交什么數據的時候,都是通過倉儲對象Repository去操作的,前端基本上感覺不到數據訪問層的存在。這樣說你有沒有好理解一點呢?沒有?好吧,我們來看Demo。

       

      2、MEF在倉儲模式上面的應用:由于框架使用的是EF,所以這里也用EF結合倉儲模式進行講解。為了省略Repository模式的復雜結構,我們僅僅通過倉儲的Save方法來說明。

      IRepository<TEntity>接口以及實現代碼:

        public interface IRepository<T>
           where T : BaseEntity
          {
              T Save(T entitiy);
          }
        [Export(typeof(IRepository<BaseEntity>))]
          public abstract class Repository<T> : IRepository<T> where T : BaseEntity
          {
              //工作單元
              [Import]
              protected IUnitOfWork context { set; get; }
      
              private IDbSet<T> _entities;
      
              //注冊MEF
              public Repository()
              {
                  Register.regisgter().ComposeParts(this);
              }
      
              public virtual T Save(T entitiy)
              {
                  if (entitiy == null) throw new ArgumentException("entitiy nul");
                  context.Save<T>(entitiy);
                  return entitiy;
              }
          }
      
          public static class Register
          {
              public static CompositionContainer regisgter()
              {
                  var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
                  var container = new CompositionContainer(catalog);
                  return container;
              }
          }

      BaseEntity是一個EF實體的公共基類,定義EF實體必須要遵循的約束。

       

      IUnitOfWork工作單元接口以及實現

       

        public interface IUnitOfWork : IDisposable
          {
              int Commit();
      
              void Rollback();
      
              void Save<T>(T entity) where T : BaseEntity;
          }
           /// <summary>
              /// 單元操作實現
              /// </summary>
           [Export(typeof(IUnitOfWork))]
      public abstract class UnitOfWorkContextBase : IUnitOfWork { [ImportMany] protected abstract IEnumerable<DbContext> Contexts { get; } protected abstract DbContext Cur_context { get; set; } public UnitOfWorkContextBase() {
                Register.regisgter().ComposeParts(this);
      if (Contexts.Count() <= 0) { throw new Exception(); } Cur_context = Contexts.FirstOrDefault(); } /// <summary> /// 獲取 當前單元操作是否已被提交 /// </summary> public bool IsCommitted { get; private set; } /// <summary> /// 提交當前單元操作的結果 /// </summary> /// <returns></returns> public int Commit() { if (IsCommitted) { return 0; } try { int result = Cur_context.SaveChanges(); IsCommitted = true; return result; } catch (DbUpdateException e) { if (e.InnerException != null && e.InnerException.InnerException is SqlException) { SqlException sqlEx = e.InnerException.InnerException as SqlException; string msg = DataHelper.GetSqlExceptionMessage(sqlEx.Number); throw PublicHelper.ThrowDataAccessException("提交數據更新時發生異常:" + msg, sqlEx); } throw; } } /// <summary> /// 把當前單元操作回滾成未提交狀態 /// </summary> public void Rollback() { IsCommitted = false; } public void Dispose() { if (!IsCommitted) { Commit(); } Cur_context.Dispose(); } public void Save<T>(T entity) where T : T { Cur_context.SaveChanges(); } }

      既然這里使用了ImportMany,那么肯定有一個地方需要Export。我們使用EF新建一個edmx文件,在生成的上下文對象上面加上Export

        [Export(typeof(DbContext))]
          public partial class Entities : DbContext
          {
              public Entities()
                  : base("name=Entities")
              {
              }
          
              protected override void OnModelCreating(DbModelBuilder modelBuilder)
              {
                  throw new UnintentionalCodeFirstException();
              }
          
              public DbSet<TB_USERS> TB_USERS { get; set; }
          }

      這里為什么要使用ImportMany?前面說了,倉儲的好處之一在于對數據訪問層做封裝,使得前端不比關心數據的具體來源。當我們再建一個數據庫連接的edmx時,我們只需要修改倉儲里面的Cur_context 這個對象的賦值即可,由于其他地方都是針對Cur_context這一個上下文對象做的操作,所以基本都不需要做很大的變化。繞了這么大一圈,其實博主只是想說明Import和ImportMany和倉儲模式結合使用的好處,至于倉儲模式的適用性問題不是本文的重點。

       

      posted @ 2015-08-31 15:31  懶得安分  閱讀(6880)  評論(6)    收藏  舉報
      主站蜘蛛池模板: 国产男女黄视频在线观看| caoporn成人免费公开| 99久久久国产精品免费无卡顿| 四虎永久精品免费视频| 福利网午夜视频一区二区| 一区二区三区精品偷拍| 日本三级理论久久人妻电影| 亚洲色婷婷一区二区三区| 一本精品99久久精品77| 久久精品中文字幕免费| 黄色大全免费看国产精品| 国内视频偷拍久久伊人网| 日韩一区二区三区精品区| 日韩 一区二区在线观看| 中文字幕无码专区一VA亚洲V专| 又爽又黄又无遮掩的免费视频| 成人精品网一区二区三区| 忍着娇喘人妻被中出中文字幕| 性视频一区| 久久精品亚洲精品国产色婷| 亚洲一区二区偷拍精品| 婷婷99视频精品全部在线观看| 亚洲综合av男人的天堂| 日韩亚洲中文图片小说| XXXXXHD亚洲日本HD| 久久精品国产亚洲av麻豆小说| 亚洲蜜桃av一区二区三区| 国产午夜福利不卡在线观看| 国产精品无码无卡在线播放| 国产在线无码不卡播放| 人妻在线中文字幕| 乌审旗| 日韩大片高清播放器| 国产午夜福利免费入口| 亚洲一区二区三区18禁| 苍井空毛片精品久久久| 上杭县| 北岛玲中文字幕人妻系列| 久久精品夜夜夜夜夜久久| 亚洲中文字幕国产综合| 1024你懂的国产精品|