自己寫乙個依賴注入容器Container

2022-06-23 03:57:09 字數 2139 閱讀 9842

前言:在平時的寫**中為了解耦、方便擴充套件,經常使用一些di容器(如:autofac、unity),那是特別的好用。

關於它的底層實現** 大概是這樣。

一、使用依賴注入的好處

關於使用依賴注入建立物件的好處網上一找就是一大堆(低耦合、可配置等),這裡就不複製貼上了。

二、使用xml+assembly實現可配置的container

namespace

com.cqgc.testsys.core

if (xml == null

)

return

instance;}}

//////

向外提供建立物件的方法

/// ///

service

///public t resolve()

where t : class

//////

通過xml中的service名建立對應的業務邏輯實體

/// ///

component

///service名字

///component

public t getcomponentinstance(string

service)

where t : class

//在ui層的服務實現配置檔案根據介面檔名讀取實現介面檔案的業務邏輯實體

var element = (from p in xml.root.elements("

element")

where p.attribute("id"

).value.equals(service)

select

new).firstordefault();

//沒找到配置節點

if (string

.isnullorempty(element.classnamespace))

string configs = element.classnamespace.split(','

);

//xml配置中介面和業務邏輯實體不成對

if (configs.length != 2

)

proxygenerator generator = new proxygenerator();//

**生成器

t t = (t)assembly.load(configs[1]).createinstance(configs[0]);//

根據配置檔案例項化乙個物件

return

t; }

//釋放資源

public

void

dispose()

}}

三、xml

<?

xml version="1.0" encoding="utf-8"

?>

<

root

>

<

element

id="iuserservice"

service

="com.cqgc.testsys.service.iuserservice, com.cqgc.testsys.service"

class

="com.cqgc.testsys.component.usercomponent, com.cqgc.testsys.component"

>

element

>

<

element

id="isysuserservice"

service

="com.cqgc.testsys.service.isysuserservice, com.cqgc.testsys.service"

class

="com.cqgc.testsys.component.sysusercomponent, com.cqgc.testsys.component"

>

element

>

root

>

四、呼叫

var _user=container.instance.resolve();

建立你自己的依賴注入容器Ioc Container

最近研究了ioc,di 以及一些開源的框架,以下根據自己的理解寫乙個簡單的ioc容器。我們在使用乙個依賴注入容器時一般都是實現三步 建立乙個ioc容器 依賴關係注入,這裡需要一種collection物件儲存這種注入關係 根據依賴注入獲取物件的例項 好了,接下來我們可以按照測試驅動開發的模式完成乙個簡...

建立你自己的依賴注入容器Ioc Container

最近研究了ioc,di 以及一些開源的框架,以下根據自己的理解寫乙個簡單的ioc容器。我們在使用乙個依賴注入容器時一般都是實現三步 建立乙個ioc容器 依賴關係注入,這裡需要一種collection物件儲存這種注入關係 根據依賴注入獲取物件的例項 好了,接下來我們可以按照測試驅動開發的模式完成乙個簡...

自己寫乙個LIST

pragma once forward declarations templateclass clistnode templateclass clist template class clistnode void insertafter t data template void clistnode ...