日韩天天综合网_野战两个奶头被亲到高潮_亚洲日韩欧美精品综合_av女人天堂污污污_视频一区**字幕无弹窗_国产亚洲欧美小视频_国内性爱精品在线免费视频_国产一级电影在线播放_日韩欧美内地福利_亚洲一二三不卡片区

關(guān)于DDD:管理工作單元實(shí)例的兩種模式的使用方法_.Net教程

編輯Tag賺U幣

推薦:淺談對(duì)Jquery+JSON+WebService的使用小結(jié)
本篇文章介紹了對(duì)Jquery+JSON+WebService的使用小結(jié)。需要的朋友參考下

圖如下:

在常見的用例場(chǎng)景下,類圖的對(duì)象圖如下:

問題在一個(gè)用例執(zhí)行過程中,如何保證同一個(gè)界限上下文內(nèi)的所有倉儲(chǔ)實(shí)例可以共享同一個(gè)工作單元實(shí)例?解決方案1
倉儲(chǔ)采用依賴注入模式 + 使用IOC管理工作單元的生命周期(PerRequest或其它)。

代碼示例

復(fù)制代碼 代碼如下:www.hl5o.cn

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<服務(wù)>();
buider.RegisterType<倉儲(chǔ)A>();
buider.RegisterType<倉儲(chǔ)B>();
buider.RegisterType<工作單元>().InstancePerLifetimeScope();

var container = buider.Build();

dynamic 服務(wù) = container.Resolve<服務(wù)>();

//下邊兩行代碼輸出一樣
Console.WriteLine(服務(wù).倉儲(chǔ)A.工作單元.GetHashCode());
Console.WriteLine(服務(wù).倉儲(chǔ)B.工作單元.GetHashCode());
}
}

public class 服務(wù)
{
private readonly 倉儲(chǔ)A _倉儲(chǔ)A;
private readonly 倉儲(chǔ)B _倉儲(chǔ)B;

public 服務(wù)(倉儲(chǔ)A 倉儲(chǔ)A, 倉儲(chǔ)B 倉儲(chǔ)B)
{
_倉儲(chǔ)A = 倉儲(chǔ)A;
_倉儲(chǔ)B = 倉儲(chǔ)B;
}

public 倉儲(chǔ)A 倉儲(chǔ)A
{
get { return _倉儲(chǔ)A; }
}

public 倉儲(chǔ)B 倉儲(chǔ)B
{
get { return _倉儲(chǔ)B; }
}
}

public class 工作單元 { }

public class 倉儲(chǔ)A
{
private readonly 工作單元 _工作單元;

public 倉儲(chǔ)A(工作單元 工作單元)
{
_工作單元 = 工作單元;
}

public 工作單元 工作單元
{
get { return _工作單元; }
}
}

public class 倉儲(chǔ)B
{
private readonly 工作單元 _工作單元;

public 倉儲(chǔ)B(工作單元 工作單元)
{
_工作單元 = 工作單元;
}

public 工作單元 工作單元
{
get { return _工作單元; }
}
}
}

解決方案2
倉儲(chǔ)采用服務(wù)定位器模式 + 使用服務(wù)定位器或簡單工廠管理工作單元的生命周期(PerRequest或其它)。
代碼示例
復(fù)制代碼 代碼如下:www.hl5o.cn

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 服務(wù)定位器;

static void Main(string[] args)
{
var buider = new ContainerBuilder();
buider.RegisterType<服務(wù)>();
buider.RegisterType<倉儲(chǔ)A>();
buider.RegisterType<倉儲(chǔ)B>();
buider.RegisterType<工作單元>().InstancePerLifetimeScope();

服務(wù)定位器 = buider.Build();

dynamic 服務(wù) = 服務(wù)定位器.Resolve<服務(wù)>();

//下邊兩行代碼輸出一樣
Console.WriteLine(服務(wù).倉儲(chǔ)A.工作單元.GetHashCode());
Console.WriteLine(服務(wù).倉儲(chǔ)B.工作單元.GetHashCode());
}
}

public class 服務(wù)
{
private readonly 倉儲(chǔ)A _倉儲(chǔ)A;
private readonly 倉儲(chǔ)B _倉儲(chǔ)B;

public 服務(wù)(倉儲(chǔ)A 倉儲(chǔ)A, 倉儲(chǔ)B 倉儲(chǔ)B)
{
_倉儲(chǔ)A = 倉儲(chǔ)A;
_倉儲(chǔ)B = 倉儲(chǔ)B;
}

public 倉儲(chǔ)A 倉儲(chǔ)A
{
get { return _倉儲(chǔ)A; }
}

public 倉儲(chǔ)B 倉儲(chǔ)B
{
get { return _倉儲(chǔ)B; }
}
}

public class 工作單元 { }

public class 倉儲(chǔ)A
{
private readonly 工作單元 _工作單元;

public 倉儲(chǔ)A()
{
_工作單元 = Program.服務(wù)定位器.Resolve<工作單元>();
}

public 工作單元 工作單元
{
get { return _工作單元; }
}
}

public class 倉儲(chǔ)B
{
private readonly 工作單元 _工作單元;

public 倉儲(chǔ)B()
{
_工作單元 = Program.服務(wù)定位器.Resolve<工作單元>();
}

public 工作單元 工作單元
{
get { return _工作單元; }
}
}
}

由此示例可以看出,服務(wù)定位器和依賴注入可以混合在一起使用。這個(gè)例子我為了簡單,服務(wù)定位器和IOC容器是同一個(gè)實(shí)例。

 

有些系統(tǒng)將服務(wù)定位器的實(shí)現(xiàn)換成簡單工廠模式,他們本質(zhì)上是一樣的(服務(wù)定位器是一個(gè)萬能工廠)。

代碼示例

復(fù)制代碼 代碼如下:www.hl5o.cn

public class 工作單元工廠
{
public static 工作單元 創(chuàng)建()
{
var 工作單元 = (工作單元)CallContext.GetData("工作單元");

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

return 工作單元;
}
}

 

分享:ASP.NET中后臺(tái)注冊(cè)js腳本使用的方法對(duì)比
接下來為大家介紹下使用Page.ClientScript.RegisterClientScriptBlock 和Page.ClientScript.RegisterStartupScript:區(qū)別

來源:模板無憂//所屬分類:.Net教程/更新時(shí)間:2013-04-29
相關(guān).Net教程