婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 關于DDD:管理工作單元實例的兩種模式的使用方法

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

熱門標簽:凱立德導航官網地圖標注 五常地圖標注 萊蕪外呼電銷機器人價格 戶外地圖標注軟件手機哪個好用 地圖標注和認領 電銷語音自動機器人 長春呼叫中心外呼系統哪家好 鄭州400電話辦理 聯通 智能電話營銷外呼系統
圖如下:

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

問題在一個用例執行過程中,如何保證同一個界限上下文內的所有倉儲實例可以共享同一個工作單元實例?解決方案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 工作單元;
     }
 }

標簽:福州 湖州 宣城 紅河 岳陽 西藏 衢州 西寧

巨人網絡通訊聲明:本文標題《關于DDD:管理工作單元實例的兩種模式的使用方法》,本文關鍵詞  關于,DDD,管理工作,單元,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《關于DDD:管理工作單元實例的兩種模式的使用方法》相關的同類信息!
  • 本頁收集關于關于DDD:管理工作單元實例的兩種模式的使用方法的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 噶尔县| 无棣县| 泸定县| 都兰县| 内乡县| 古田县| 体育| 离岛区| 上杭县| 新蔡县| 隆化县| 蒙城县| 高阳县| 霍山县| 和田市| 尉犁县| 梁河县| 开远市| 潜江市| 六枝特区| 沂南县| 上高县| 山阴县| 浦县| 临泉县| 丘北县| 千阳县| 纳雍县| 文成县| 绥中县| 朝阳县| 桓仁| 赞皇县| 田林县| 南宁市| 兰坪| 柳州市| 容城县| 柳河县| 石渠县| 黑山县|