• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    关于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 工作单元;
         }
     }

    上一篇:基于.NET中:自动将请求参数绑定到ASPX、ASHX和MVC的方法(菜鸟必看)
    下一篇:浅谈对Jquery+JSON+WebService的使用小结
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    关于DDD:管理工作单元实例的两种模式的使用方法 关于,DDD,管理工作,单元,