关闭顶部展开顶部

关于DDD:管理工作单元实例的两种模式的使用方法_.Net教程

编辑Tag赚U币

推荐:浅谈对Jquery+JSON+WebService的使用小结
本篇文章介绍了对Jquery+JSON+WebService的使用小结。需要的朋友参考下

图如下:

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

问题在一个用例执行过程中,如何保证同一个界限上下文内的所有仓储实例可以共享同一个工作单元实例?解决方案1
仓储采用依赖注入模式 + 使用IOC管理工作单元的生命周期(PerRequest或其它)。

代码示例

复制代码 代码如下:www.mb5u.com

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或其它)。
代码示例
复制代码 代码如下:www.mb5u.com

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容器是同一个实例。

 

有些系统将服务定位器的实现换成简单工厂模式,他们本质上是一样的(服务定位器是一个万能工厂)。

代码示例

复制代码 代码如下:www.mb5u.com

public class 工作单元工厂
{
public static 工作单元 创建()
{
var 工作单元 = (工作单元)CallContext.GetData("工作单元");

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

return 工作单元;
}
}

 

分享:ASP.NET中后台注册js脚本使用的方法对比
接下来为大家介绍下使用Page.ClientScript.RegisterClientScriptBlock 和Page.ClientScript.RegisterStartupScript:区别

来源:模板无忧//所属分类:.Net教程/更新时间:2013-04-29
loading.. 评论加载中....
相关.Net教程
闁汇埄鍨遍悺鏇綖閸℃稒鈷掓い鏇楀亾妞わ綇鎷�
婵炲濮崑鎾斥槈閺傝法澧涙俊鑼€濋柣銏╁灲閹凤拷
婵犵鈧啿鈧绱炲澶嬪殧鐎瑰嫭澹嗙换涔侀柣銏╁灲閹凤拷
婵犵鈧啿鈧绱炲澶婄闁诡垎鍕槬闁诲酣娼уΛ娑㈡偉閿燂拷
闂佺ǹ绻愰幊搴ㄥ焵椤掑倸甯堕幖瀛樼矒瀹曟繈鏁撻敓锟�
闂佺ǹ绻愰幊搴ㄥ焵椤掆偓閸氬绮婇敂鍓х煓閻庯絺鏅濋惌娆戠磽娓氬﹥瀚�
闂佽 鍋撴い鏍ㄧ☉閻︻噣鏌涘┑鎰胺缂併劍妞藉銊╊敍濞嗘垵绗¢梺鍝勫€婚幊鎾舵閿燂拷
闂佸搫鍟版慨椋庣礊婢舵劖鐓i悹杞拌濞层倕霉閿濆棙绀€闁告ɑ鐗犲畷鎰版晸閿燂拷
濠碘槅鍨崜婵嗩熆濡吋瀚绘い鎾寸箖鐎氾拷
婵犵鈧啿鈧绱炲鍥ㄥ妞ゆ挻绻冪€氳櫕淇婇妤€澧叉繝顫嫹
濠碘槅鍨崜婵嗩熆濮椻偓瀹曨剟顢欓崗鐓庘偓鐢告煛閸繄孝濠殿噯鎷�
濠碘槅鍨崜婵嗩熆濮椻偓閺屽懘鍩€椤掆偓閳诲酣骞戦幇闈涙闂佸搫瀚搁幏锟�
濠碘槅鍨崜婵嗩熆濮椻偓瀹曪綁骞嬪┑鍫紝
婵犵鈧啿鈧绱炲澶婄煑闁瑰瓨绻勯瀛樹繆椤栨澧叉繝顫嫹
闁诲骸鍘滈崜婵嬫偋閹惰棄鐭楀┑鐘插暙閼靛綊鏌ら懞銉ュ闁绘牭缍佸畷娆撴晸閿燂拷
UB闂佸湱绮崝妤呯嵁閸モ晜瀚氶悗娑櫳戦~锟�
闂佽壈椴稿濠氭焾鐎电硶鍋撻獮鍨仾婵犫偓閿燂拷
闁诲骸绠嶉崹鍝勶耿閸㈢嚜
闂佸憡姊绘慨椋庣礊婢跺瞼鍗氭繛鍡楀閸炲绻涚紙鐘哄厡闁稿骏鎷�
缂傚倷鐒﹂悷锕傚垂濠婂嫮顩锋い鎺嶇缁插湱鈧偣鍊濈紓姘额敊閿燂拷
©2017 www.mb5u.com濠碘槅鍨崜婵嗩熆濮椻偓瀵噣鎮╅幓鎺撳瘶
闂佽 鍋撻柟顖滃椤ワ拷&闂佸憡甯掑Λ鏃堟閿燂拷