亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間:2013年04月28日 11:43:50   作者:  
本篇文章介紹了,關(guān)于DDD:管理"工作單元實(shí)例"的兩種模式的使用方法。需要的朋友參考下
圖如下:

在常見(jiàn)的用例場(chǎng)景下,類圖的對(duì)象圖如下:

問(wèn)題在一個(gè)用例執(zhí)行過(guò)程中,如何保證同一個(gè)界限上下文內(nèi)的所有倉(cāng)儲(chǔ)實(shí)例可以共享同一個(gè)工作單元實(shí)例?解決方案1 
倉(cāng)儲(chǔ)采用依賴注入模式 + 使用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<倉(cāng)儲(chǔ)A>();
             buider.RegisterType<倉(cāng)儲(chǔ)B>();
             buider.RegisterType<工作單元>().InstancePerLifetimeScope();

             var container = buider.Build();

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

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

     public class 服務(wù)
     {
         private readonly 倉(cāng)儲(chǔ)A _倉(cāng)儲(chǔ)A;
         private readonly 倉(cāng)儲(chǔ)B _倉(cāng)儲(chǔ)B;

         public 服務(wù)(倉(cāng)儲(chǔ)A 倉(cāng)儲(chǔ)A, 倉(cāng)儲(chǔ)B 倉(cāng)儲(chǔ)B)
         {
             _倉(cāng)儲(chǔ)A = 倉(cāng)儲(chǔ)A;
             _倉(cāng)儲(chǔ)B = 倉(cāng)儲(chǔ)B;
         }

         public 倉(cāng)儲(chǔ)A 倉(cāng)儲(chǔ)A
         {
             get { return _倉(cāng)儲(chǔ)A; }
         }

         public 倉(cāng)儲(chǔ)B 倉(cāng)儲(chǔ)B
         {
             get { return _倉(cāng)儲(chǔ)B; }
         }
     }

     public class 工作單元 { }

     public class 倉(cāng)儲(chǔ)A
     {
         private readonly 工作單元 _工作單元;

         public 倉(cāng)儲(chǔ)A(工作單元 工作單元)
         {
             _工作單元 = 工作單元;
         }

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

     public class 倉(cāng)儲(chǔ)B
     {
         private readonly 工作單元 _工作單元;

         public 倉(cāng)儲(chǔ)B(工作單元 工作單元)
         {
             _工作單元 = 工作單元;
         }

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

解決方案2
倉(cāng)儲(chǔ)采用服務(wù)定位器模式 + 使用服務(wù)定位器或簡(jiǎn)單工廠管理工作單元的生命周期(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<倉(cāng)儲(chǔ)A>();
             buider.RegisterType<倉(cāng)儲(chǔ)B>();
             buider.RegisterType<工作單元>().InstancePerLifetimeScope();

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

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

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

     public class 服務(wù)
     {
         private readonly 倉(cāng)儲(chǔ)A _倉(cāng)儲(chǔ)A;
         private readonly 倉(cāng)儲(chǔ)B _倉(cāng)儲(chǔ)B;

         public 服務(wù)(倉(cāng)儲(chǔ)A 倉(cāng)儲(chǔ)A, 倉(cāng)儲(chǔ)B 倉(cāng)儲(chǔ)B)
         {
             _倉(cāng)儲(chǔ)A = 倉(cāng)儲(chǔ)A;
             _倉(cāng)儲(chǔ)B = 倉(cāng)儲(chǔ)B;
         }

         public 倉(cāng)儲(chǔ)A 倉(cāng)儲(chǔ)A
         {
             get { return _倉(cāng)儲(chǔ)A; }
         }

         public 倉(cāng)儲(chǔ)B 倉(cāng)儲(chǔ)B
         {
             get { return _倉(cāng)儲(chǔ)B; }
         }
     }

     public class 工作單元 { }

     public class 倉(cāng)儲(chǔ)A
     {
         private readonly 工作單元 _工作單元;

         public 倉(cāng)儲(chǔ)A()
         {
             _工作單元 = Program.服務(wù)定位器.Resolve<工作單元>();
         }

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

     public class 倉(cāng)儲(chǔ)B
     {
         private readonly 工作單元 _工作單元;

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

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

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

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

代碼示例

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

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

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

         return 工作單元;
     }
 }

相關(guān)文章

最新評(píng)論