一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

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

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 工作單元;
     }
 }

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 放荡的女老板bd中文字幕 | 四虎2020紧急免费入口 | 精新精新国产自在现 | 国产精品女主播大秀在线 | 黄网国产 | 日本指交| 水野朝阳厨房系列在线观看 | 国产精品日韩欧美在线 | 色老板在线播放 | 国产精品吹潮香蕉在线观看 | 99福利在线观看 | 九九热在线免费观看 | 国产丰满美女做爰 | 亚洲国产成人久久精品hezyo | 男人天堂bt | 动漫美女隐私尿口图片 | 免费看60分钟大片视频播放 | 国产欧美日韩精品在线 | 青草久久精品亚洲综合专区 | 亚洲红怡院 | 国产精品欧美在线观看 | 亚洲国产精品一区二区久久 | 国产成人精品视频午夜 | 亚洲国产午夜 | 久九九精品免费视频 | 色综色天天综合网 | 热99这里有精品综合久久 | 免费一级毛片在线播放放视频 | 精品久久久噜噜噜久久7 | 久见久热 这里只有精品 | 美女用屁股把人吞进肚子 | 亚洲狠狠网站色噜噜 | 国产精品香蕉夜间视频免费播放 | 国产一级一级一级成人毛片 | 日本免费观看95视频网站 | porono日本人xxx | 激情亚洲天堂 | 日韩二区三区 | 欧美日韩国产成人综合在线影院 | 亚洲精品久久麻豆蜜桃 | 天堂8在线天堂资源bt |