关于DDD:管理"工作单元实例"的两种模式的使用方法
更新时间:2013年04月28日 11:43:50 作者:
本篇文章介绍了,关于DDD:管理"工作单元实例"的两种模式的使用方法。需要的朋友参考下
图如下:
仓储采用依赖注入模式 + 使用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 工作单元;
}
}

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

仓储采用依赖注入模式 + 使用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 工作单元;
}
}
相关文章
asp.net mvc下拉框Html.DropDownList 和DropDownListFor的常用方法
这篇文章主要介绍了asp.net mvc下拉框Html.DropDownList 和DropDownListFor的常用方法 ,需要的朋友可以参考下2014-10-10
ASP.NET 使用application与session对象写的简单聊天室程序
写了快一年的asp.net,application对象还真没怎么用过。看了看书,根据这两个对象的特性写了一个简单的聊天室程序。真的是非常的简陋2014-07-07
aspx文件格式使用URLRewriter实现静态化变成html
如何隐藏aspx文件格式,变成html,使用asp.net 开发的网页程序,使用URLRewriter.dll 实现静态化,接下来将介绍下具体操作步骤,感兴趣的朋友可以参考下2013-04-04
.Net Core WebApi部署在Linux服务器上的方法
这篇文章主要介绍了.Net Core WebApi部署在Linux服务器上的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2020-03-03


最新评论