1. 程式人生 > >Castle.Windsor依賴注入的高階應用_Castle.Windsor.3.1.0

Castle.Windsor依賴注入的高階應用_Castle.Windsor.3.1.0

1. 使用程式碼方式進行元件註冊【依賴服務類】

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using CastleDemo.Lib;


using Castle.Windsor;
using Castle.Windsor.Configuration.Interpreters;
using Castle.MicroKernel.Registration;


namespace CastleDemo.Lib.Mgr
{
    /// <summary>
    /// 管理類
    /// </summary>
    public partial class Mgr
    {
        private static IWindsorContainer container = null;

        /// <summary>
        /// 自定義容器和元件註冊
        /// </summary>
        /// <returns></returns>
        public static IWindsorContainer GetContainer()
        {

            if (container == null)
            {
                Type objTypeA = Type.GetType("CastleDemo.Lib.Oracle.OracleDatabase, CastleDemo.Lib.Oracle");
                Type objTypeB = Type.GetType("CastleDemo.Lib.Sql.SqlDatabase, CastleDemo.Lib.Sql");


                //建立容器
                IWindsorContainer tmpContainer = new WindsorContainer();


                //加入元件:舊版
                //tmpContainer.AddComponent("CastleDemo.Lib.Oracle.OracleDatabase", typeof(IDatabase), objTypeA);
                //tmpContainer.AddComponent("CastleDemo.Lib.Sql.SqlDatabase", typeof(IDatabase), objTypeB);

                //加入元件:新版
                tmpContainer.Register(Component.For(typeof(IDatabase)).ImplementedBy(objTypeA).Named("CastleDemo.Lib.Oracle.OracleDatabase"));
                tmpContainer.Register(Component.For(typeof(IDatabase)).ImplementedBy(objTypeB).Named("CastleDemo.Lib.Sql.SqlDatabase"));
           

                container = tmpContainer;

            }
            return container;
        }
    }
}

2. 使用程式碼方式進行元件註冊【不需要依賴】【類似反射的全字串形式】

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Castle.Windsor;
using Castle.Windsor.Configuration.Interpreters;
using Castle.MicroKernel.Registration;

namespace CastleDemo.Lib.Container
{
    /// <summary>
    /// 管理類
    /// </summary>
    public partial class Container
    {
        private static IWindsorContainer container = null;

        /// <summary>
        /// 自定義容器和元件註冊
        /// </summary>
        /// <returns></returns>
        public static IWindsorContainer GetContainer()
        {

            if (container == null)
            {
                Type objType = Type.GetType("CastleDemo.Lib.IDatabase, CastleDemo.Lib");

                Type objTypeA = Type.GetType("CastleDemo.Lib.Oracle.OracleDatabase, CastleDemo.Lib.Oracle");
                Type objTypeB = Type.GetType("CastleDemo.Lib.Sql.SqlDatabase, CastleDemo.Lib.Sql");


                //建立容器
                IWindsorContainer tmpContainer = new WindsorContainer();


                //加入元件:舊版
                //tmpContainer.AddComponent("CastleDemo.Lib.Oracle.OracleDatabase", objType, objTypeA);
                //tmpContainer.AddComponent("CastleDemo.Lib.Sql.SqlDatabase", objType, objTypeB);

                //加入元件:新版
                tmpContainer.Register(Component.For(objType).ImplementedBy(objTypeA).Named("CastleDemo.Lib.Oracle.OracleDatabase"));
                tmpContainer.Register(Component.For(objType).ImplementedBy(objTypeB).Named("CastleDemo.Lib.Sql.SqlDatabase"));
                   
                container = tmpContainer;

            }
            return container;
        }
    }
}

3. 使用配置檔案進行元件註冊【不需要依賴】

3.1. 定義配置檔案

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="castle" type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler, Castle.Windsor" />
  </configSections>
  <castle>
    <components>
      <component name="CastleDemo.Lib.Oracle.OracleDatabase" type="CastleDemo.Lib.Oracle.OracleDatabase, CastleDemo.Lib.Oracle" service="CastleDemo.Lib.IDatabase, CastleDemo.Lib"/>
      <component name="CastleDemo.Lib.Sql.SqlDatabase" type="CastleDemo.Lib.Sql.SqlDatabase, CastleDemo.Lib.Sql" service="CastleDemo.Lib.IDatabase, CastleDemo.Lib"/>
    </components>
  </castle>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>

3.2. 讀取config配置檔案進行元件註冊

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using CastleDemo.Lib;


using Castle.Windsor;
using Castle.Windsor.Configuration.Interpreters;
using Castle.MicroKernel.Registration;

namespace CastleDemo.Run
{
    public partial class Helper
    {

        /// <summary>
        /// 根據配置檔案裡的服務名生成物件
        /// </summary>
        public static void GetFrom_Config()
        {

            IWindsorContainer container = new WindsorContainer(new XmlInterpreter());

            string vServiceName = "CastleDemo.Lib.Oracle.OracleDatabase";//服務名
            vServiceName = "CastleDemo.Lib.Sql.SqlDatabase";

            if (container != null)
            {
                IDatabase db = container.Resolve<IDatabase>(vServiceName);
                if (db != null)
                {
                    db.Select("..........");
                }

            }

        }



    }
}

4. Demo下載

點此下載

5. Castle容器的元件生存週期,主要有如下幾種


5.1. Singleton : 容器中只有一個例項將被建立

5.2. Transient : 每次請求建立一個新例項

5.3. PerThread: 每執行緒中只存在一個例項

5.4. PerWebRequest : 每次web請求建立一個新例項

5.5. Pooled :使用"池化"方式管理元件,可使用PooledWithSize方法設定池的相關屬性

相關推薦

Castle.Windsor依賴注入高階應用_Castle.Windsor.3.1.0

1. 使用程式碼方式進行元件註冊【依賴服務類】 using System; using System.Collections.Generic; using System.Linq; using System.Text; using CastleDemo.Lib; us

Castle.Windsor依賴註入的高級應用_Castle.Windsor.3.1.0

mic sum port let 有一個 設置 .text per nbsp [轉]Castle.Windsor依賴註入的高級應用_Castle.Windsor.3.1.0 1. 使用代碼方式進行組件註冊【依賴服務類】 using System; using System

ThinkPHP 3.1中的SQL注入漏洞分析----論ThinkPHP 3.1中的半吊子的PDO封裝

我總結ThinkPHP的PDO封裝可以用買櫝還珠來下結論,表面上封裝了PDO支援,但實際卻並沒有使用到PDO的精髓部分,這不是買櫝還珠是什麼呢? 花了一些時間瞭解到ThinkPHP 3.1框架,其官方網站上對其描述得相當不錯,但隨著我閱讀其程式碼,事實並不是想象的那

Spring.NET教程(六)依賴注入(應用篇)

談到高階語言程式設計,我們就會聯想到設計模式;談到設計模式,我們就會說道怎麼樣解耦合。而Spring.net的IoC容器其中的一種用途就是解耦合,其最經典的應用就是:依賴注入(Dependeny Injection)簡稱DI,目前DI是最優秀的解耦方式之一。下面我就來談談依賴注入的應用場景。 我模擬了三種不

spring下應用@Resource, @Autowired 和 @Inject註解進行依賴注入的差異

為了探尋 ‘@Resource’, ‘@Autowired’, 和‘@Inject’如何解決依賴注入中的問題,我建立了一個“Party”介面,和它的兩個實現類“Person”,“Organization”。這樣我就可以在注入Bean的時候不必使用具體型別(指使用介面型別即可)。這樣做也方便我研究當一個介面有多

Spring 的依賴注入應用代替工廠模式

介面 package FactoryExample; public interface Human { void eat(); void walk(); void show(); } 實現 實現一 package FactoryExample; public clas

非web的JAVA應用使用Spring的依賴注入

需求:普通JAVA應用程式使用spring的依賴注入,但不關聯其他額外包。 最近在寫普通JAVA應用,開發只用了maven管理,沒有利用其他框架。然後類都需要自己管理,配置檔案要編碼讀取等多種麻煩

Angular4-線上競拍應用-依賴注入

依賴注入:Dependency Injection 簡稱DI 注入器 constructor(private productServie:ProductService){...} 提供器 providers:[{provider:ProductSe

ASP.NET Core應用的7種依賴注入方式

ASP.NET Core框架中的很多核心物件都是通過依賴注入方式提供的,如用來對應用進行初始化的Startup物件、中介軟體物件,以及ASP.NET Core MVC應用中的Controller物件和View物件等,所以我們可以在定義它們的時候採用注入的形式來消費已經註冊的服務。下面簡單介紹幾種服務注入的應用

redis高階應用

Redis叢集簡介 Redis 叢集是3.0之後才引入的,在3.0之前,使用哨兵(sentinel)機制(本文將不做介紹,大家可另行查閱)來監控各個節點之間的狀態。Redis 叢集可謂是讓很多人久等了。 Redis 叢集是一組能進行資料共享的Redis 例項(服務或者節點)的設施,叢集可以使

SpringFramework的核心:IOC容器的實現------IoC容器的依賴注入

如果IoC容器已經載入了使用者定義的Bean資訊,並開始分析依賴注入的原理。依賴注入是使用者第一次向IoC容器索要Bean時觸發的,當然也有例外。如果我們設定了lazy-init的屬性。是可以在剛開始初始化容器的時候就為我們生成新的bean。 首先我們從DefaultListableBean

Asp.net MVC中如何實現依賴注入(DI)(二)

昨天說了一下Castle與Autofac如何在MVC中的使用,今天再來簡單說一下Spring.Net框架在MVC中如何依賴注入的。 官網:http://www.springframework.net/ 專案結構圖:   首先,我們要在專案中新增Spring.Net的類庫引用,我們可以在N

淺談依賴注入

轉載自部落格園一位前輩寫的很不錯的文章 作者: yangecnu(yangecnu’s Blog on 部落格園) 出處:http://www.cnblogs.com/yangecnu/ 淺談依賴注入 最近幾天在看一本名為Dependency Injection in .NET

Spring 學習筆記 - IOC/依賴注入

簡述: Spring 學習 - IOC/依賴注入 1. Bean 的例項化 1) 直接使用原始類建立bean <bean id="exampleBean" class="com.anialy.test.ExampleBean" /> 2) 使用工廠方法建立

PHP 控制反轉與依賴注入詳細分析與程式碼實現

PHP有很多的設計模式,比如單例模式,訂閱模式,策略模式,工廠模式,觀察者模式,這些設計模式其實無非都是為了讓程式簡化,容易維護,模組間解耦。現在我們來講講PHP的另外一種設計模式,控制反轉/依賴注入,這兩者其實是同一個概念,只是凶不同的角度去解釋的而已。 依賴注入:是從需要實現的業務邏輯上面去

深入研究Spring-IoC:原始碼分析依賴注入

1.前言 對於容器建立的過程已經闡述過一遍了,下面是依賴注入的問題。Spring提供的依賴注入的方法主要由兩種:一種是通過getBean的方法;另一種是通過註解@Autowaire。 需要指出的是依賴注入的過程是使用者第一次向ioc容器索要Bean的時候開始生產的,也可以通過設定

Postman高階應用(8):檔案變成了亂碼——下載檔案

背景 在做後臺管理系統時候,涉及到匯出報表等功能,如果我們用以前的方式請求,往往會看到返回一堆亂碼,而不是我們想要的檔案。其實Postman為我們提供了檔案下載功能,同樣普通的html文字和json資料也可以返回儲存為檔案。 實戰 點發送按鈕旁邊的三角形,然後點Send a

PHP規範PSR11(依賴注入容器介面)介紹

本文件描述了依賴注入容器的通用介面。 ContainerInterface設定的目標是標準化框架和庫如何使用容器來獲取物件和引數(在本文件的其餘部分中稱為條目)。 本文件中的關鍵詞“必須”,“必須”,“必需”,“應該”,“不應該”,“應該”,“不應該”,“推薦”,“可以”和“可選”按照RFC

Java高階應用:執行緒池全面解析

  什麼是執行緒池?   很簡單,簡單看名字就知道是裝有執行緒的池子,我們可以把要執行的多執行緒交給執行緒池來處理,和連線池的概念一樣,通過維護一定數量的執行緒池來達到多個執行緒的複用。   執行緒池的好處 &n

1.Spring、IOC與依賴注入

 Spring概述 Spring是分層的Java SE/EE應用 full-stack輕量級開源框架,以IoC(Inverse Of Control:反轉控制)和 AOP(Aspect Oriented Programming:面向切面程式設計)為核心,提供了展現層Spr