1. 程式人生 > >Castle中AdditionalInterfaces用法介紹

Castle中AdditionalInterfaces用法介紹

首先見下圖(圖一),其中FooController是一個沒有實現任何Interface的空類。需要實現的效果是:通過FooController物件呼叫FooService的Do方法。設定這一不常見的場景主要是為了說明Castle中AdditionalInterfaces的用法。

這個場景詭異的地方在於FooController是一個空類,其類和物件都沒什麼可供呼叫的?假如FooController也有一個Do方法,那麼通過Castle給FooController物件新增攔截器,就可以輕鬆實現上述的效果。

基於上述分析,方案分兩步走:

第一步, 安裝常規的方法建立攔截器,並通過攔截器呼叫FooService的Do方法。攔截器程式碼見圖二。

第二步, 動態的給FooController新增Do方法。在Castle中有兩種做法,一種是使用castle的mixin方式,網上已有相關用法的介紹。 本文著重介紹另一種使用方式:AdditionalInterfaces。使用其實很簡單(如圖三):Component.For(typeof(FooController)).Proxy.AdditionalInterfaces(typeof(IFooService))。 意思就是給FooController型別的代理類新增一個介面IFooService。

最後呼叫(圖三), 通過  var obj = container.Resolve<FooController>(); 獲取FooController的FooController的代理類物件,然後通過反射呼叫其Do方法(因為代理類實現了介面IFooService)。最後攔截器攔截代理類物件的Do方法,完成真正呼叫FooService的Do方法實名。

(圖一)

(圖二)

(圖三)

(圖四)

相關推薦

CastleAdditionalInterfaces用法介紹

首先見下圖(圖一),其中FooController是一個沒有實現任何Interface的空類。需要實現的效果是:通過FooController物件呼叫FooService的Do方法。設定這一不常見的場景主要是為了說明Castle中AdditionalInterfaces的用法。 這個場景詭異的地方在於Foo

SqlCAST用法介紹

1、cast用法簡介: CAST (expression AS data_type)引數說明:expression:任何有效的SQServer表示式。AS:用於分隔兩個引數,在AS之前的是要處理的資料,在AS之後是要轉換的資料型別。data_type:目標系統所提供的資料型別,包括bigint和

C++STLsort用法介紹

自定義STL中sort的排序規則 前情提要: 0、要使用sort,首先需要包含標頭檔案< algorithm> 1、sort函式可以指定兩個引數,也可以指定三個引數。 (1)第一個是要排序

C++ 標準模板庫STLvector用法介紹

本文所介紹的std::vector用法基於C++11,std::vector定義於標頭檔案<vector>中,其定義如下:template< class T, class Allocator = std::allocator<T>

C++ 標準模板庫STLset用法介紹

本文所介紹的std::set用法基於C++11,std::set定義於標頭檔案<set>中,其定義如下:template<     class Key,     class Compare = std::less<Key>,     class

mysql模糊查詢的四種用法介紹

包含 如果 正則 搜索 name 模糊查詢 長度 use mysql 下面介紹mysql中模糊查詢的四種用法: 1,%:表示任意0個或多個字符。可匹配任意類型和長度的字符,有些情況下若是中文,請使用兩個百分號(%%)表示。 比如 SELECT * FROM [user] W

JavaBigDecimal類介紹用法

exceptio decimal body ue4 mage oat 比較運算符 mod 乘法   Java中提供了大數字(超過16位有效位)的操作類,即 java.math.BinInteger 類和 java.math.BigDecimal 類,用於高精度計算.   其

jstypeof用法詳細介紹

css -name iter owin lease implement Language addition 並不是

shellIF的用法介紹

一、語法結構 if [ condition ] then      statements  [elif condition      then statements. 

Mabitis的#與$符號區別及用法介紹

一、介紹  mybatis 中使用 Mapper.xml裡面的配置進行 sql 查詢,經常需要動態傳遞引數,例如我們需要根據使用者的姓名來篩選使用者時,sql 如下: ?

javaequals的另類用法以及Objects其他方法介紹

equals方法對於java程式設計師來說應該是常用的方法,它通常用來對字串型別的比較,通常,我們的寫法是這樣: //案例1 Map<String,Object> map1 = new HashMap<>(); Map<String,Object>

python的map()函式和reduce()函式的區別和用法介紹

咱們先從定義上來解釋一下這兩個函式的區別: ①從引數方面來講: map(func, *iterables)包含兩個引數,第一個是引數是一個函式,第二個是序列(列表或元組)。其中,函式(即map的第一個引

ArcGIS Spatial Adjustment 用法介紹

一、背景   在mapGIS 中向量化的圖無標準座標,只有相對座標,向量圖中心為原點。現要將向量圖與遙感影像進行疊加。所以需將向量圖轉到遙感影像座標下。開啟遙感影像與向量圖如下(上方為遙感影像,下方為向量圖),兩者不僅位置對應不上,比例也不相對應。 二、解決方法  

Spring和SpringBoot的@Component 和@ComponentScan註解用法介紹和注意事項

通過本文你將學到: Component Scan是什麼? 為什麼ComponentScan很重要? 專案中Spring Boot會對哪些包自動執行掃描(Component Scan)? 如何利用Spring Boot定義掃描範圍? 專案啟動時關於Compone

pythonFraction()方法的用法介紹

小編是想將字串的分數,轉換為浮點型的小數才接觸到這個方法的。 原始碼如下: class Fraction(numbers.Rational): """This class implements rational numbers. In the two-argument fo

TensorFlow tf.app.flags.FLAGS 的用法介紹

下面介紹 tf.app.flags.FLAGS 的使用,主要是在用命令列執行程式時,需要傳些引數,程式碼如下: 新建一個名為:app_flags.py 的檔案。 #coding:utf-8 # 學習使用 tf.app.flags 使用,全域性變數 # 可以再命令列中執行也

oracleConnect By用法介紹

為解決oracle中自連線查詢不適合操作大表的情況,採用connect by 方式實現。oracle中可以用START WITH...CONNECT BY PRIOR子句實現遞迴查詢,connect by 在結構化查詢中應用。 基本語法:             selec

Mysqlexplain用法和結果欄位的含義介紹

使用 explain 查詢和分析SQl的執行記錄,可以進行sql的效能優化! explain用法 mysql> explain select * from students; +----+-------------+----------

關於react-redux的connect用法介紹及原理解析

關於react-redux的一個流程圖 流程圖 connect用法介紹 connect方法宣告: connect([mapStateToProps], [mapDispatchToProps], [mergeProps],[options]) 作用:連線Reac

CMakeinclude指令用法介紹

本文主要介紹CMake中include指令的用法。 1 概述 引用CMake官網對於include指令的介紹,如下: Load and run CMake code from a file or module. include指令的用法如下: include(<