关于DDD:管理"工作单元实例"的两种模式的使用方法
2023-06-13 09:14:52 时间
图如下:
仓储采用依赖注入模式+使用IOC管理工作单元的生命周期(PerRequest或其它)。复制代码代码如下:
在常见的用例场景下,类图的对象图如下:
仓储采用依赖注入模式+使用IOC管理工作单元的生命周期(PerRequest或其它)。
代码示例
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Threading.Tasks;
usingAutofac;
namespaceAutoFacStudy
{
classProgram
{
staticvoidMain(string[]args)
{
varbuider=newContainerBuilder();
buider.RegisterType<服务>();
buider.RegisterType<仓储A>();
buider.RegisterType<仓储B>();
buider.RegisterType<工作单元>().InstancePerLifetimeScope();
varcontainer=buider.Build();
dynamic服务=container.Resolve<服务>();
//下边两行代码输出一样
Console.WriteLine(服务.仓储A.工作单元.GetHashCode());
Console.WriteLine(服务.仓储B.工作单元.GetHashCode());
}
}
publicclass服务
{
privatereadonly仓储A_仓储A;
privatereadonly仓储B_仓储B;
public服务(仓储A仓储A,仓储B仓储B)
{
_仓储A=仓储A;
_仓储B=仓储B;
}
public仓储A仓储A
{
get{return_仓储A;}
}
public仓储B仓储B
{
get{return_仓储B;}
}
}
publicclass工作单元{}
publicclass仓储A
{
privatereadonly工作单元_工作单元;
public仓储A(工作单元工作单元)
{
_工作单元=工作单元;
}
public工作单元工作单元
{
get{return_工作单元;}
}
}
publicclass仓储B
{
privatereadonly工作单元_工作单元;
public仓储B(工作单元工作单元)
{
_工作单元=工作单元;
}
public工作单元工作单元
{
get{return_工作单元;}
}
}
}
解决方案2
仓储采用服务定位器模式+使用服务定位器或简单工厂管理工作单元的生命周期(PerRequest或其它)。
代码示例
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Threading.Tasks;
usingAutofac;
namespaceAutoFacStudy
{
classProgram
{
publicstaticIContainer服务定位器;
staticvoidMain(string[]args)
{
varbuider=newContainerBuilder();
buider.RegisterType<服务>();
buider.RegisterType<仓储A>();
buider.RegisterType<仓储B>();
buider.RegisterType<工作单元>().InstancePerLifetimeScope();
服务定位器=buider.Build();
dynamic服务=服务定位器.Resolve<服务>();
//下边两行代码输出一样
Console.WriteLine(服务.仓储A.工作单元.GetHashCode());
Console.WriteLine(服务.仓储B.工作单元.GetHashCode());
}
}
publicclass服务
{
privatereadonly仓储A_仓储A;
privatereadonly仓储B_仓储B;
public服务(仓储A仓储A,仓储B仓储B)
{
_仓储A=仓储A;
_仓储B=仓储B;
}
public仓储A仓储A
{
get{return_仓储A;}
}
public仓储B仓储B
{
get{return_仓储B;}
}
}
publicclass工作单元{}
publicclass仓储A
{
privatereadonly工作单元_工作单元;
public仓储A()
{
_工作单元=Program.服务定位器.Resolve<工作单元>();
}
public工作单元工作单元
{
get{return_工作单元;}
}
}
publicclass仓储B
{
privatereadonly工作单元_工作单元;
public仓储B()
{
_工作单元=Program.服务定位器.Resolve<工作单元>();
}
public工作单元工作单元
{
get{return_工作单元;}
}
}
}
由此示例可以看出,服务定位器和依赖注入可以混合在一起使用。这个例子我为了简单,服务定位器和IOC容器是同一个实例。
有些系统将服务定位器的实现换成简单工厂模式,他们本质上是一样的(服务定位器是一个万能工厂)。
代码示例
publicclass工作单元工厂
{
publicstatic工作单元创建()
{
var工作单元=(工作单元)CallContext.GetData("工作单元");
if(工作单元==null)
{
工作单元=new工作单元();
CallContext.SetData("工作单元",工作单元);
}
return工作单元;
}
}
相关文章
- 静态vlan的配置方式_实例方法与静态方法的区别
- vue父组件调用子组件属性_vue子组件获取父组件实例
- 下列那个类有获取PropertyDescriptor实例的方法_java获取properties的值
- Mysql存在则修改不存在则新增的两种实现方法实例
- Linux查看ip的实例方法
- 快速掌握 Oracle 多实例创建技巧(oracle创建多实例)
- 多个Oracle实例的启动方法示例(oracle启动多个实例)
- 实例分析:Oracle数据库查询(oracle查询列子)
- MySQL实例:快速免费下载(mysql实例下载)
- 用Oracle查看实例个数的方法(oracle查看实例个数)
- Oracle SQL中最多的数量统计实例(oracle sql数量)
- aspmatch正则函数使用Matchs实例
- php生成xml简单实例代码
- php上传功能实例代码
- ThinkPHP中实例Model方法的区别说明
- JSP分页显示的实例代码
- javascript重写alert方法的实例代码
- 简单实例处理url特殊符号&处理(2种方法)
- c#启动EXE文件的方法实例
- JavaScript调用后台的三种方法实例
- php文件上传的简单实例
- Jedis出现connectiontimeout问题解决方法(JedisPool连接池使用实例)