關(guān)于DDD:管理"工作單元實(shí)例"的兩種模式的使用方法
在常見(jiàn)的用例場(chǎng)景下,類圖的對(duì)象圖如下:
倉(cāng)儲(chǔ)采用依賴注入模式 + 使用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<服務(wù)>();
buider.RegisterType<倉(cāng)儲(chǔ)A>();
buider.RegisterType<倉(cāng)儲(chǔ)B>();
buider.RegisterType<工作單元>().InstancePerLifetimeScope();
var container = buider.Build();
dynamic 服務(wù) = container.Resolve<服務(wù)>();
//下邊兩行代碼輸出一樣
Console.WriteLine(服務(wù).倉(cāng)儲(chǔ)A.工作單元.GetHashCode());
Console.WriteLine(服務(wù).倉(cāng)儲(chǔ)B.工作單元.GetHashCode());
}
}
public class 服務(wù)
{
private readonly 倉(cāng)儲(chǔ)A _倉(cāng)儲(chǔ)A;
private readonly 倉(cāng)儲(chǔ)B _倉(cāng)儲(chǔ)B;
public 服務(wù)(倉(cāng)儲(chǔ)A 倉(cāng)儲(chǔ)A, 倉(cāng)儲(chǔ)B 倉(cāng)儲(chǔ)B)
{
_倉(cāng)儲(chǔ)A = 倉(cāng)儲(chǔ)A;
_倉(cāng)儲(chǔ)B = 倉(cāng)儲(chǔ)B;
}
public 倉(cāng)儲(chǔ)A 倉(cāng)儲(chǔ)A
{
get { return _倉(cāng)儲(chǔ)A; }
}
public 倉(cāng)儲(chǔ)B 倉(cāng)儲(chǔ)B
{
get { return _倉(cāng)儲(chǔ)B; }
}
}
public class 工作單元 { }
public class 倉(cāng)儲(chǔ)A
{
private readonly 工作單元 _工作單元;
public 倉(cāng)儲(chǔ)A(工作單元 工作單元)
{
_工作單元 = 工作單元;
}
public 工作單元 工作單元
{
get { return _工作單元; }
}
}
public class 倉(cāng)儲(chǔ)B
{
private readonly 工作單元 _工作單元;
public 倉(cāng)儲(chǔ)B(工作單元 工作單元)
{
_工作單元 = 工作單元;
}
public 工作單元 工作單元
{
get { return _工作單元; }
}
}
}
解決方案2
倉(cāng)儲(chǔ)采用服務(wù)定位器模式 + 使用服務(wù)定位器或簡(jiǎn)單工廠管理工作單元的生命周期(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 服務(wù)定位器;
static void Main(string[] args)
{
var buider = new ContainerBuilder();
buider.RegisterType<服務(wù)>();
buider.RegisterType<倉(cāng)儲(chǔ)A>();
buider.RegisterType<倉(cāng)儲(chǔ)B>();
buider.RegisterType<工作單元>().InstancePerLifetimeScope();
服務(wù)定位器 = buider.Build();
dynamic 服務(wù) = 服務(wù)定位器.Resolve<服務(wù)>();
//下邊兩行代碼輸出一樣
Console.WriteLine(服務(wù).倉(cāng)儲(chǔ)A.工作單元.GetHashCode());
Console.WriteLine(服務(wù).倉(cāng)儲(chǔ)B.工作單元.GetHashCode());
}
}
public class 服務(wù)
{
private readonly 倉(cāng)儲(chǔ)A _倉(cāng)儲(chǔ)A;
private readonly 倉(cāng)儲(chǔ)B _倉(cāng)儲(chǔ)B;
public 服務(wù)(倉(cāng)儲(chǔ)A 倉(cāng)儲(chǔ)A, 倉(cāng)儲(chǔ)B 倉(cāng)儲(chǔ)B)
{
_倉(cāng)儲(chǔ)A = 倉(cāng)儲(chǔ)A;
_倉(cāng)儲(chǔ)B = 倉(cāng)儲(chǔ)B;
}
public 倉(cāng)儲(chǔ)A 倉(cāng)儲(chǔ)A
{
get { return _倉(cāng)儲(chǔ)A; }
}
public 倉(cāng)儲(chǔ)B 倉(cāng)儲(chǔ)B
{
get { return _倉(cāng)儲(chǔ)B; }
}
}
public class 工作單元 { }
public class 倉(cāng)儲(chǔ)A
{
private readonly 工作單元 _工作單元;
public 倉(cāng)儲(chǔ)A()
{
_工作單元 = Program.服務(wù)定位器.Resolve<工作單元>();
}
public 工作單元 工作單元
{
get { return _工作單元; }
}
}
public class 倉(cāng)儲(chǔ)B
{
private readonly 工作單元 _工作單元;
public 倉(cāng)儲(chǔ)B()
{
_工作單元 = Program.服務(wù)定位器.Resolve<工作單元>();
}
public 工作單元 工作單元
{
get { return _工作單元; }
}
}
}
由此示例可以看出,服務(wù)定位器和依賴注入可以混合在一起使用。這個(gè)例子我為了簡(jiǎn)單,服務(wù)定位器和IOC容器是同一個(gè)實(shí)例。
有些系統(tǒng)將服務(wù)定位器的實(shí)現(xiàn)換成簡(jiǎn)單工廠模式,他們本質(zhì)上是一樣的(服務(wù)定位器是一個(gè)萬(wàn)能工廠)。
代碼示例
public class 工作單元工廠
{
public static 工作單元 創(chuàng)建()
{
var 工作單元 = (工作單元)CallContext.GetData("工作單元");
if (工作單元 == null)
{
工作單元 = new 工作單元();
CallContext.SetData("工作單元", 工作單元);
}
return 工作單元;
}
}
相關(guān)文章
VS2010中呈現(xiàn)控件時(shí)出錯(cuò)的解決方法
如何解決“呈現(xiàn)控件時(shí)出錯(cuò)”的問(wèn)題,這篇文章主要介紹了VS2010中出現(xiàn)"呈現(xiàn)控件時(shí)出錯(cuò)"問(wèn)題的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01介紹幾個(gè)ASP.NET中容易忽略但卻很重要的方法函數(shù)
介紹幾個(gè)ASP.NET中容易忽略但卻很重要的方法函數(shù)...2006-09-09C# 獲取當(dāng)前星期幾三種實(shí)現(xiàn)方法
獲取當(dāng)前星期幾實(shí)現(xiàn)這個(gè)功能有多種方法,接下來(lái)將列出3種供你參考,感興趣的你可不要錯(cuò)過(guò)了哈,希望本文所提供的知識(shí)點(diǎn)對(duì)你有所幫助2013-02-02HTTP協(xié)議下用Web Service上傳大文件的解決方案
HTTP協(xié)議下用Web Service上傳大文件的解決方案...2007-04-04擴(kuò)展ASP.NET MVC三層框架且使用StructureMap實(shí)現(xiàn)依賴注入1-Model層
本篇文章將向大家介紹如何添加Service和Repository層并且使用StructureMap把Service層注入到Controller,把Repository注入到Service層。2013-04-04利用Aspose.Cells實(shí)現(xiàn)萬(wàn)能導(dǎo)出功能
這篇文章主要為大家詳細(xì)介紹了利用Aspose.Cells實(shí)現(xiàn)萬(wàn)能導(dǎo)出功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12Asp.Net防止刷新重復(fù)提交數(shù)據(jù)的辦法
最近在用Asp.Net編寫(xiě)點(diǎn)東西時(shí)遇到個(gè)問(wèn)題:即用戶在提交表單后按刷新就會(huì)重復(fù)提交數(shù)據(jù),即所謂的“刷新重復(fù)提交”的問(wèn)題。2013-03-03