手机
当前位置:查字典教程网 >编程开发 >asp.net教程 >关于DDD:管理"工作单元实例"的两种模式的使用方法
关于DDD:管理"工作单元实例"的两种模式的使用方法
摘要:图如下:在常见的用例场景下,类图的对象图如下:问题在一个用例执行过程中,如何保证同一个界限上下文内的所有仓储实例可以共享同一个工作单元实例?...

图如下:

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

在常见的用例场景下,类图的对象图如下:

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

问题在一个用例执行过程中,如何保证同一个界限上下文内的所有仓储实例可以共享同一个工作单元实例?解决方案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:管理"工作单元实例"的两种模式的使用方法】相关文章:

压缩aspx页面删除多余空格的两种方法

在.NET中利用XMLHTTP下载文件的代码

WebService出现"因 URL 意外地以 结束,请求格式无法识别"的解决方法

未处理的事件"PageIndexChanging" 之解决方案

引用全局程序集缓存内的程序集的方法

asp.net SAF 中缓存服务的实现第1/5页

C# web api返回类型设置为json的两种方法

asp.net获取HTML表单File中的路径的方法

充分利用ASP.NET的三种缓存提高站点性能的注意方法

asp.net中利用Jquery+Ajax+Json实现无刷新分页的实例代码

精品推荐
分类导航