佳木斯湛栽影视文化发展公司

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

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

熱門標(biāo)簽:Mysql連接數(shù)設(shè)置 團購網(wǎng)站 電子圍欄 科大訊飛語音識別系統(tǒng) 銀行業(yè)務(wù) Linux服務(wù)器 阿里云 服務(wù)器配置
圖如下:

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

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

代碼示例

復(fù)制代碼 代碼如下:

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服務(wù)>();
             buider.RegisterType倉儲A>();
             buider.RegisterType倉儲B>();
             buider.RegisterType工作單元>().InstancePerLifetimeScope();

             var container = buider.Build();

             dynamic 服務(wù) = container.Resolve服務(wù)>();

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

     public class 服務(wù)
     {
         private readonly 倉儲A _倉儲A;
         private readonly 倉儲B _倉儲B;

         public 服務(wù)(倉儲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
倉儲采用服務(wù)定位器模式 + 使用服務(wù)定位器或簡單工廠管理工作單元的生命周期(PerRequest或其它)。
代碼示例
復(fù)制代碼 代碼如下:

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 服務(wù)定位器;

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

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

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

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

     public class 服務(wù)
     {
         private readonly 倉儲A _倉儲A;
         private readonly 倉儲B _倉儲B;

         public 服務(wù)(倉儲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.服務(wù)定位器.Resolve工作單元>();
         }

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

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

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

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

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

有些系統(tǒng)將服務(wù)定位器的實現(xiàn)換成簡單工廠模式,他們本質(zhì)上是一樣的(服務(wù)定位器是一個萬能工廠)。

代碼示例

復(fù)制代碼 代碼如下:

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

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

         return 工作單元;
     }
 }

標(biāo)簽:衡水 江蘇 蚌埠 廣元 大理 衢州 棗莊 萍鄉(xiāng)

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《關(guān)于DDD:管理工作單元實例的兩種模式的使用方法》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    永定县| 衡阳市| 商洛市| 西城区| 胶州市| 娄烦县| 赞皇县| 乌拉特前旗| 胶南市| 碌曲县| 科尔| 信丰县| 临武县| 普陀区| 迁西县| 维西| 大厂| 岢岚县| 佛教| 白朗县| 巫山县| 德钦县| 亳州市| 洛南县| 黑河市| 南郑县| 阿坝县| 永胜县| 内黄县| 崇文区| 镇康县| 盈江县| 五寨县| 武定县| 镇赉县| 尼木县| 舒兰市| 长垣县| 明光市| 无锡市| 略阳县|