天天看點

Unity使用案例(檔案配置)Unity使用案例(檔案配置)

Unity使用案例(檔案配置)

untiy 從nuget上下載下傳

項目為簡單三層架構。 接口--業務邏輯層--資料通路層--資料實體層。

接口定義 業務層和資料通路層 接口。

需求實作使用Unity 能夠內建異常管理

一、介紹一下業務邏輯

  用戶端 調用bll.GetList();擷取背景資料。bll中調用的是dal.GetList();

  我們希望在 調用GetList 系統能夠自動處理異常。不要再在每個方法中都去寫

  try{}catch{}。這樣很麻煩業務邏輯也顯得臃腫。

二、定義異常标簽,異常處理handler

  要想解決以上問題,可以用Unity的攔截機制這樣做,定義異常特性或者叫屬性

?

namespace

Common

{

public

class

ExceptionExpandAttribute : HandlerAttribute

{

public

int

ID {

get

;

set

; }

// 摘要:

//     Derived classes implement this method. When called, it creates a new call

//     handler as specified in the attribute configuration.

//

// 參數:

//   container:

//     The Microsoft.Practices.Unity.IUnityContainer to use when creating handlers,

//     if necessary.

//

// 傳回結果:

//     A new call handler object.

public

override

ICallHandler CreateHandler(IUnityContainer container)

{

var handler = container.Resolve<ExceptionHandler>();

handler.Order =

this

.Order;

handler.ID = ID;

return

handler;

}

}

}

  建立異常處理handler

?

public

class

ExceptionHandler:ICallHandler

{

public

int

Order {

get

;

set

; }

public

int

ID {

get

;

set

; }

public

IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)

{

if

(ID == 100)

throw

new

Exception(

"AOP異常處理出現異常:Dal出現異常"

);

var methodReturn = getNext().Invoke(input, getNext);

if

(methodReturn.Exception !=

null

)

throw

new

Exception(

"AOP異常處理出現異常"

, methodReturn.Exception);

return

methodReturn;

}

}

 實作ICallHandler的 Invoke 方法,input 能夠截獲到調用方法傳入的參數,getNext().Invoke(input, getNext); 能夠得到傳回值。我們在

getNext().Invoke(input, getNext);此方法執行後可以截獲異常,并進行封裝,這裡簡寫。

給要進行異常處理的方法加上标簽

?

public

interface

IBll

{

[ExceptionExpand(Order=1,ID=10)]

List<QueryModel> GetList();

}

public

interface

IDal

{

[ExceptionExpand(Order = 1, ID = 100)]

List<QueryModel> GetList();

}

  

然後,前台在配置檔案中配置各個對象

三、配置檔案配置

  

?

<unity xmlns=

"http://schemas.microsoft.com/practices/2010/unity"

>

<sectionExtension type=

"Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension, Microsoft.Practices.Unity.Interception.Configuration"

/>

<alias alias=

"IBll"

type=

"InterfaceDefined.IBll,InterfaceDefined"

/>

<alias alias=

"IDal"

type=

"InterfaceDefined.IDal,InterfaceDefined"

/>

<container>

<extension type=

"Interception"

/>

<register type=

"IBll"

mapTo=

"BusinessEntiy.Bll,BusinessEntiy"

>

<constructor>

<param name=

"Name"

value=

"nihao"

/>

</constructor>

<interceptor type=

"TransparentProxyInterceptor"

/>

<policyInjection />

</register>

<register type=

"IDal"

mapTo=

"DataAccess.Dal,DataAccess"

>

<interceptor type=

"TransparentProxyInterceptor"

/>

<policyInjection />

</register>

</container>

</unity>

  很簡單指定注冊類,指定類初始化參數,interceptor類型使用TransparentProxyInterceptor

測試:

  

  其他日志,緩存大同小異,寫的簡單,好了解。

标簽: Unity 攔截