国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - ASP.NET教程 - 關于DDD:管理"工作單元實例"的兩種模式的使用方法

關于DDD:管理"工作單元實例"的兩種模式的使用方法

2019-11-05 10:54asp.net教程網 ASP.NET教程

本篇文章介紹了,關于DDD:管理"工作單元實例"的兩種模式的使用方法。需要的朋友參考下

圖如下:

關于DDD:管理"工作單元實例"的兩種模式的使用方法

在常見的用例場景下,類圖的對象圖如下:

關于DDD:管理"工作單元實例"的兩種模式的使用方法

問題在一個用例執行過程中,如何保證同一個界限上下文內的所有倉儲實例可以共享同一個工作單元實例?解決方案1 
倉儲采用依賴注入模式 + 使用IOC管理工作單元的生命周期(PerRequest或其它)。

代碼示例

復制代碼代碼如下:


using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;

 using Autofac;

 namespace AutoFacStudy
 {
     class Program
     {
         static void Main(string[] args)
         {
             var buider = new ContainerBuilder();
             buider.RegisterType<服務>();
             buider.RegisterType<倉儲A>();
             buider.RegisterType<倉儲B>();
             buider.RegisterType<工作單元>().InstancePerLifetimeScope();

             var container = buider.Build();

             dynamic 服務 = container.Resolve<服務>();

             //下邊兩行代碼輸出一樣
             Console.WriteLine(服務.倉儲A.工作單元.GetHashCode());
             Console.WriteLine(服務.倉儲B.工作單元.GetHashCode());
         }
     }

     public class 服務
     {
         private readonly 倉儲A _倉儲A;
         private readonly 倉儲B _倉儲B;

         public 服務(倉儲A 倉儲A, 倉儲B 倉儲B)
         {
             _倉儲A = 倉儲A;
             _倉儲B = 倉儲B;
         }

         public 倉儲A 倉儲A
         {
             get { return _倉儲A; }
         }

         public 倉儲B 倉儲B
         {
             get { return _倉儲B; }
         }
     }

     public class 工作單元 { }

     public class 倉儲A
     {
         private readonly 工作單元 _工作單元;

         public 倉儲A(工作單元 工作單元)
         {
             _工作單元 = 工作單元;
         }

         public 工作單元 工作單元
         {
             get { return _工作單元; }
         }
     }

     public class 倉儲B
     {
         private readonly 工作單元 _工作單元;

         public 倉儲B(工作單元 工作單元)
         {
             _工作單元 = 工作單元;
         }

         public 工作單元 工作單元
         {
             get { return _工作單元; }
         }
     }
 }


解決方案2 
倉儲采用服務定位器模式 + 使用服務定位器或簡單工廠管理工作單元的生命周期(PerRequest或其它)。
代碼示例

復制代碼代碼如下:


using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;

 using Autofac;

 namespace AutoFacStudy
 {
     class Program
     {
         public static IContainer 服務定位器;

         static void Main(string[] args)
         {
             var buider = new ContainerBuilder();
             buider.RegisterType<服務>();
             buider.RegisterType<倉儲A>();
             buider.RegisterType<倉儲B>();
             buider.RegisterType<工作單元>().InstancePerLifetimeScope();

             服務定位器 = buider.Build();

             dynamic 服務 = 服務定位器.Resolve<服務>();

             //下邊兩行代碼輸出一樣
             Console.WriteLine(服務.倉儲A.工作單元.GetHashCode());
             Console.WriteLine(服務.倉儲B.工作單元.GetHashCode());
         }
     }

     public class 服務
     {
         private readonly 倉儲A _倉儲A;
         private readonly 倉儲B _倉儲B;

         public 服務(倉儲A 倉儲A, 倉儲B 倉儲B)
         {
             _倉儲A = 倉儲A;
             _倉儲B = 倉儲B;
         }

         public 倉儲A 倉儲A
         {
             get { return _倉儲A; }
         }

         public 倉儲B 倉儲B
         {
             get { return _倉儲B; }
         }
     }

     public class 工作單元 { }

     public class 倉儲A
     {
         private readonly 工作單元 _工作單元;

         public 倉儲A()
         {
             _工作單元 = Program.服務定位器.Resolve<工作單元>();
         }

         public 工作單元 工作單元
         {
             get { return _工作單元; }
         }
     }

     public class 倉儲B
     {
         private readonly 工作單元 _工作單元;

         public 倉儲B()
         {
             _工作單元 = Program.服務定位器.Resolve<工作單元>();
         }

         public 工作單元 工作單元
         {
             get { return _工作單元; }
         }
     }
 }


由此示例可以看出,服務定位器和依賴注入可以混合在一起使用。這個例子我為了簡單,服務定位器和IOC容器是同一個實例。

 

有些系統將服務定位器的實現換成簡單工廠模式,他們本質上是一樣的(服務定位器是一個萬能工廠)。

代碼示例

復制代碼代碼如下:


public class 工作單元工廠
 {
     public static 工作單元 創建()
     {
         var 工作單元 = (工作單元)CallContext.GetData("工作單元");

         if (工作單元 == null)
         {
             工作單元 = new 工作單元();
             CallContext.SetData("工作單元", 工作單元);
         }

         return 工作單元;
     }
 }

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 国产精品午夜电影 | 日韩免费在线视频 | 一级黄片毛片免费看 | 久久99精品视频 | 国产噜噜噜噜噜久久久久久久久 | 成人久久久久久 | 中文字幕亚洲一区二区va在线 | 激情欧美一区二区三区中文字幕 | 一区二区三区四区国产 | 一级黄色a | a在线看| 日韩欧美亚洲 | 国产成人精品一区二区三区 | 日本1区 | 国产大片一区 | 久久精品伊人 | av一区二区三区四区 | 香蕉yeye凹凸一区二区三区 | 伊人久久综合 | 视频在线一区二区 | 亚洲激情一区二区三区 | 亚洲久久| 九九热在线播放 | 精品久久一二三区 | 国产精品视频久久 | 国产一区二区三区四区二区 | 欧美freesex黑人又粗又大 | 欧美精品一区二区三区在线 | 国产一区二区三区精品久久久 | 成人日韩| av在线免费观看一区二区 | 最新国产在线 | 国产综合精品 | 久久久亚洲国产天美传媒修理工 | 毛片免费在线 | 成人综合区 | 男女视频网址 | 日本久久综合 | 亚洲一区二区三区在线播放 | 亚洲第一免费播放区 | 在线无码|