【轉】Castle Windsor之組件注冊

【轉】Castle Windsor之組件注冊

注冊方式較多,大體有這么幾種,學習得比較粗淺,先記錄:


1、逐個注冊組件
即對每個接口通過代碼指定其實現類,代碼:
container.Register(Component.For<IMyService>() //接口.ImplementedBy<MyService>() //實現類
);


典型應用場景:例如定義了一個日志記錄接口,放到一個獨立程序集中。具體實現可能有多種方式(日志以文本文件/XML文件/數據庫等不同方式存儲),則可以為每個實現類建立一個獨立的程序集,在各程序集中將自身注冊為接口的實現。這樣當我們需要日志的某個存儲形式時,選擇對應的dll即可


2、按規則批量注冊
和1比較類似,不同的是,不用逐個指定接口和實現類,而是指定一個規則,Windsor會用規則去匹配和注冊當前應用中所有程序集。代碼:
container.Register(Classes.FromThisAssembly()	//當前程序集,也可以調用其它方法,如FromAssemblyInDirectory()等.InSameNamespaceAs<RootComponent>() //與RootComponent類具有相同的命名空間,還可以用InNamespace("Com.Spbdev")直接指定命名空間.WithService.DefaultInterfaces()	.LifestyleTransient());	//生命周期


3、按程序集安裝注冊
與按照規則批量注冊類似,差別在于每個程序集內部自己實現一個IWindsorInstaller接口來定義注冊規則。也就是將注冊規則下放到程序集。
首先,需要指定對哪些程序集進行安裝注冊(只指定對程序集的搜索規則):
container.Install(FromAssembly.InDirectory(new AssemblyFilter("Extensions")));//Extensions目錄下的所有程序集。


其次,每個程序集內通過一個或多個實現了IWindsorInstaller接口的類,來定義哪些Interface和實現類要注冊到容器。
如下代碼是官網上的一個范例:
public class RepositoriesInstaller : IWindsorInstaller
{public void Install(IWindsorContainer container, IConfigurationStore store){container.Register(Classes.FromThisAssembly().Where(Component.IsInSameNamespaceAs<RepositoriesInstaller>()).WithService.DefaultInterfaces().LifestyleTransient());}
}


意思是當前程序集中,與RepositoriesInstaller具有相同命名空間的接口、實現,都注冊到IOC容器中。




4、XML配置文件注冊
用構造函數方式注冊:
IWindsorContainer container = new WindsorContainer("dependencies.config");


或通過Install方法
container.Install(Configuration.FromXmlFile("dependencies.config"));

二、

?安裝的配置

? ? ? ? 安裝的配置比較簡單,無非是尋找安裝類,并執行安裝并獲取容器,所有的安裝類都需要繼承自IWindsorInstaller,此接口規定了方法如下:

?

void Install(IWindsorContainer container, IConfigurationStore store)
此方法用于執行容器里具體類的注冊,類注冊將在下面學習。首先看看安裝的配置:

?

?

WindsorContainer _container = new WindsorContainer();
_container.Install(FromAssembly.This(),//FromAssembly.Named("CastleWindsor"),//FromAssembly.Containing<ServicesInstaller>(),//FromAssembly.InDirectory(new AssemblyFilter("Extensions")),//FromAssembly.Instance(this.GetPluginAssembly()));

以上用install方法的每一個參數對應的配置均會被加載,如果即傳入了FromAssembly.This()又傳入了?FromAssembly.Named("CastleWindsor"),那么程序集CastleWindsor里的實現類將會被重復注冊拋錯,所以得小心不能重復注冊相同的實現類。

?

?

? ? ? ??實現類的配置

? ? ? ??實現類的配置多種多樣,根據實際需求可組合出不同的配置方式,以下就學習下一些常見的配置,高級配置可自行參考官方文檔http://docs.castleproject.org/Windsor.Fluent-Registration-API-Extensions.ashx

? ? ? ? 要想配置實現類到容易必須新建一個安裝類并在安裝類的install方法下配置,如下:

?

<pre name="code" class="csharp">    public class ChargeInstaller : IWindsorInstaller{public void Install(IWindsorContainer container, IConfigurationStore store){//container.Register(//    Component.For<IPrinter>().ImplementedBy<WenZhouPrinter>(),//    Component.For<ICharge>().ImplementedBy<WenZhouCharge>());//container.Register(Classes.FromThisAssembly().InNamespace("CastleWindsor.IEntity").WithService.DefaultInterfaces());WenZhouPrinter wz = new WenZhouPrinter();container.Register(Component.For<LoggingInterceptor>().LifeStyle.Transient,Component.For<IFactory>().ImplementedBy<PrintFactory>(),Component.For<IPrinter>().UsingFactoryMethod(p => p.Resolve<IFactory>().GetPrint()),Component.For<ICharge>().ImplementedBy<WenZhouCharge>().DependsOn(Dependency.OnValue("twitterApiKey", "123")));//繼承兩個接口//        container.Register(//              Component.For<IUserRepository, IRepository>()//              .ImplementedBy<MyRepository>()//);//簡單工廠//container//   .Register(//      Component.For<IMyService>()//         .UsingFactoryMethod(//            () => MyLegacyServiceFactory.CreateMyService())//   );// 泛型配置//container.Register(//    Component.For(typeof(IRepository<>)//        .ImplementedBy(typeof(NHRepository<>)//);//實體生命周期//container.Register(//   Component.For<IMyService>()//      .ImplementedBy<MyServiceImpl>()//      .LifeStyle.Transient//.Named("myservice.default")//   );//取先注冊的//container.Register(//    Component.For<IMyService>().ImplementedBy<MyServiceImpl>(),//    Component.For<IMyService>().ImplementedBy<OtherServiceImpl>()//);//強制取后注冊的//container.Register(//    Component.For<IMyService>().ImplementedBy<MyServiceImpl>(),//    Component.For<IMyService>().Named("OtherServiceImpl").ImplementedBy<OtherServiceImpl>().IsDefault()//);//注冊已經存在的//var customer = new CustomerImpl();//container.Register(//    Component.For<ICustomer>().Instance(customer)//    );}}


 

?

配置中可以使用UsingFactoryMethod來將對應的接口的工廠方法注冊到容器中,容器可通過該工廠方法獲取實現類,以上分別有簡單工廠和工廠方法的配置。

通過DependsOn(Dependency.OnValue("twitterApiKey", "123")可向實現類的字段twitterApiKey注入”123“字符串值。

通過設置IsDefault來規定多個實現類的默認獲取過來的類。

?

轉載于:https://www.cnblogs.com/xdot/p/7338680.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/253789.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253789.shtml
英文地址,請注明出處:http://en.pswp.cn/news/253789.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Verilog 補碼加法溢出判斷及處理

補碼加法運算溢出判斷三種方法&#xff1a; 一、符號位判斷 Xf、Yf分別兩個數的符號位,Zf為運算結果符號位。 當Xf Yf 0&#xff08;兩數同為正&#xff09;,而Zf1(結果為負)時,負溢出&#xff1b;當出現Xf Yf 1&#xff08;兩數同為負&#xff09;,而Zf0&#xff08;結果為…

Android繪制(三):Path結合屬性動畫, 讓圖標動起來!

Android繪制(一):來用shape繪出想要的圖形吧! Android繪制(二):來用Path繪出想要的圖形吧! 目錄 效果圖前言繪制屬性動畫最后效果圖 不廢話, 直接上效果圖, 感興趣再看下去. 其實不單單是效果圖演示的, 運用熟練的話各種圖標之間都是可以切換的. 前言 之前的文章也說了, path還…

{{view 視圖層}}微信小程序

微信小程序 view 視圖層//自學 1.數據綁定 數據綁定WXML中的動態數據均來自對應Page的data。 簡單綁定數據綁定使用"Mustache"語法&#xff08;雙大括號&#xff09;將變量包起來&#xff0c;可以作用于&#xff1a; 內容<view> {{ message }} </view>Pa…

CMOS圖像傳感器——概述

一、概述 圖像傳感器是把光學圖像信息轉換成電信號的器件。圖像傳感器是隨著電視技術在20世紀30年代發展起來的,早期圖像傳感器技術的最重要貢獻在于建立了掃描(Scan)的概念,用掃描的方法把二維空間平面上的光電信息離散成行(Line)和幀(Frame),然后按空間順序讀出形成…

nand flash壞塊管理OOB,BBT,ECC

0.NAND的操作管理方式 NAND FLASH的管理方式&#xff1a;以三星FLASH為例&#xff0c;一片Nand flash為一個設備(device)&#xff0c;1 (Device) xxxx (Blocks)&#xff0c;1 (Block) xxxx (Pages)&#xff0c;1(Page) 528 (Bytes) 數據塊大小(512Bytes) OOB 塊大小(16Byte…

小白學git2

你已經在本地創建了一個Git倉庫后&#xff0c;又想在GitHub創建一個Git倉庫&#xff0c;并且讓這兩個倉庫進行遠程同步&#xff0c;這樣&#xff0c;GitHub上的倉庫既可以作為備份&#xff0c;又可以讓其他人通過該倉庫來協作&#xff0c;真是一舉多得。 首先&#xff0c;登陸G…

[LeetCode_5] Longest Palindromic Substring

LeetCode: 5. Longest Palindromic Substring class Solution { public: //動態規劃算法string longestPalindrome(string s) {int n s.length();int longestBegin 0;int maxLen 1;bool table[1000][1000] {false};for (int i 0; i < n; i) {table[i][i] true;}//對角…

冒泡排序java

一、最簡單粗暴的排序 思想為&#xff1a;讓每一個關鍵字都和它后邊的每一個關鍵字比較&#xff0c; 如果大則交換&#xff0c;這樣第一個位置的關鍵字在一次循環后一定變為最小值。 1 package demo01;2 3 class BubbleSort01 {4 public static void main(String[] args) {…

CMOS圖像傳感器——工作原理

一、像素陣列結構 一般像素陣列是由水平方向的行( Row ) 和垂直方向的列(Column)正交排列構成的。像素排列的最基本設計原則是:攝像器件像素排列的坐標,必須在顯示的時候能夠準確地還原在圖像原來的相對位置上。在大多數情況下,每個像素中心線在行的方向和列的方向,即…

追尋終極數據庫 - 事務/分析混合處理系統的交付挑戰 (3)

挑戰&#xff1a;支持多個存儲引擎 以下內容并不是新發現&#xff1a;行優化存儲適用于OLTP和運營工作負載&#xff0c;而列存儲適用于BI和分析工作負載。頻繁寫入的工作負載適用于行式存儲。對Hadoop而言&#xff0c;Hbase適合低延遲工作負載&#xff0c;列式ORC文件或Parquet…

hibernate快速入門

第一步:下載Hibernate的開發包:  http://sourceforge.net/projects/hibernate/files/hibernate3 第二步:Hibernate框架目錄結構:  documentation :Hibernate文檔  lib :Hibernate開發jar包    bytecode :操作字節碼jar包.    jpa :Hibernate的實現jpa規范.   …

U-boot給kernel傳參數和kernel讀取參數—struct tag

U-boot 會給 Linux Kernel 傳遞很多參數&#xff0c;如&#xff1a;串口&#xff0c; RAM &#xff0c; videofb 等。 而 Linux kernel 也會讀取和處理這些參數。兩者之間 通過 struct tag 來傳遞參數。 U-boot 把要傳遞給 kernel 的東西保存在 struct tag 數據結構中&#xf…

異步FIFO設計(Verilog)

FIFO&#xff08;First In First Out&#xff09;是異步數據傳輸時經常使用的存儲器。該存儲器的特點是數據先進先出&#xff08;后進后出&#xff09;。其實&#xff0c;多位寬數據的異步傳輸問題&#xff0c;無論是從快時鐘到慢時鐘域&#xff0c;還是從慢時鐘到快時鐘域&…

python中RabbitMQ的使用(路由鍵模糊匹配)

路由鍵模糊匹配 使用正則表達式進行匹配。其中“#”表示所有、全部的意思&#xff1b;“*”只匹配到一個詞。 匹配規則&#xff1a; 路由鍵&#xff1a;routings [ happy.work, happy.life , happy.work.teacher, sad.work, sad.life, sad.work.teacher ] "#"&am…

數據倉庫事實表分類[轉]

1&#xff09;在數據倉庫領域有一個概念叫Transaction fact table&#xff0c;中文一般翻譯為“事務事實表”。 事務事實表是維度建模的數據倉庫中三種基本類型事實表中的一種&#xff0c;另外兩種分別是周期快照事實表和累積快照事實表。 事務事實表與周期快照事實表、累積快…

嵌入式系統文件系統比較 jffs2, yaffs, cramfs, romfs, ramdisk, ramfs/tmpfs

Linux支持多種文件系統&#xff0c;包括ext2、ext3、vfat、ntfs、iso9660、jffs、romfs和nfs等&#xff0c;為了對各類文件系統 進行統一管理&#xff0c;Linux引入了虛擬文件系統VFS(Virtual File System)&#xff0c;為各類文件系統提供一個統一的操作界面和應用編程接口。 …

Codeforces Beta Round #17 C. Balance DP

C. Balance題目鏈接 http://codeforces.com/contest/17/problem/C 題面 Nick likes strings very much, he likes to rotate them, sort them, rearrange characters within a string... Once he wrote a random string of characters a, b, c on a piece of paper and began t…

時鐘切換處理(Verilog)

隨著各種應用場景的限制&#xff0c;芯片在運行時往往需要在不同的應用下切換不同的時鐘源&#xff0c;例如低功耗和高性能模式就分別需要低頻率和高頻率的時鐘。兩個時鐘源有可能是同源且同步的&#xff0c;也有可能是不相關的。直接使用選擇邏輯進行時鐘切換大概率會導致分頻…

SSH整合中,使用父action重構子類action類.(在父類中獲取子類中的泛型對象)

import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type;import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven;/*** 文件名 : BaseAction.java* 提取SSH中的action類* 由于SSH的action中采用模型驅動的方法,使用泛…