惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - Franky
云风的 BLOG
云风的 BLOG
人人都是产品经理
人人都是产品经理
博客园 - 叶小钗
Engineering at Meta
Engineering at Meta
Vercel News
Vercel News
Y
Y Combinator Blog
B
Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Check Point Blog
M
MIT News - Artificial intelligence
Jina AI
Jina AI
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Apple Machine Learning Research
Apple Machine Learning Research
Hugging Face - Blog
Hugging Face - Blog
阮一峰的网络日志
阮一峰的网络日志
罗磊的独立博客
Stack Overflow Blog
Stack Overflow Blog
F
Fortinet All Blogs
博客园 - 司徒正美
I
InfoQ
Google DeepMind News
Google DeepMind News
GbyAI
GbyAI
U
Unit 42

博客园 - w i n s o n

Claude Code 的替代品:OpenCode — 开源免费的 AI 编程神器 使用Ajax生成的Excel文件并下載 CBMVC For Titanium Alloy 发布! CBMVC Titanium Framework 介绍 .Net插件框架的实现及分析(三) .Net插件框架的实现及分析(二) .Net插件框架的实现及分析(一) 在类库中调用资源文件实现国际化! Javascript下调用.Net资源文件,实现语言国际化 让 PowerDesigner 支持 SQLite! 图文说明如何使用T4在VS2008里生成代码 Winson.Framework 3.3 发布!! Silverlight学习问题总结(一) Winson.Framework 3.2 发布!!! 通过反射自动填充实体 Winson.Framework 3.0 正式发布!! Winson.Framework 2.5 发布! Winson.SqlPager 2.5 发布! [心得]VS2008免编译立即生效的方法
理解依赖注入及其好处!
w i n s o n · 2010-02-09 · via 博客园 - w i n s o n

理解依赖注入及其好处!

2010-02-09 09:04  w i n s o n  阅读(5971)  评论()    收藏  举报

关于依赖注入我看园子里已早有人发过相关的文章了,只是主要都是从理论角度出发,是一些虚拟的例子,感觉要真正运用起来的话可能有些朋友还不太清楚,最近我在公司的项目中就遇到一个比较麻烦的问题,正好可以使用依赖注入来解决,所以顺便写下我的心得,也方便自己以后查阅

最近在公司的项目中,遇到的问题是:我们需要使用一个第三方写的一个的控件(open source的)来生成组织架构的Chart图,其中在chart图里需要显示员工的头像,在控件里只支持输入图片流以直接生成员工头像,而在我们项目里,只能直接引用了 webserver 后才可以调用获取头像图片的流数据,所以如果要使用此chart控件的话,就还需要在chart的项目里去引用我们自己的 webserver 以调用里面的方法,但这显然是不可行的,这个chart控件是一个完全独立的第三方控件,这样引用 webserver 的话耦合性太强了,万一以后 webserver 修改来,就必须重新编译那个控件的DLL,所以只好另想办法了

这时我就想到了一个非常适合的设计模式,就是依赖注入,它能消除组件间的直接依赖关系,让组件的开发更独立,使用更灵活。依赖注入主要有以下几种:包括接口注入、构造函数注入和属性注入。

以下我就是使用接口注入来解决上述问题的:
1、先创建一个接口,实现具体需要调用的功能:

 public interface IGetImageProvider
 {
        Stream ReadFileToMemoryStream(
string empNo); //一个获取图片的方法,此方法需调用 webserver 里相关函数完成的,这里利用接口先创建方法的定义
 }

2、创建一个注入用的接口,实现2个控件间的依赖:

public interface IGetImageMgr
{
        
void InjectImage(IGetImageProvider getImage);//依赖注入的方法,让2个控件间的联系起来了
}

3、为独立的 chart 控件项目继承 IGetImageMgr 接口,然后实现 InjectImage 方法:

代码

private IGetImageProvider getImage;//定义 IGetImageProvider 接口,以实现 webserver 的方法

public void InjectImage(IGetImageProvider getImage)
{
    
this.getImage = getImage; //实现 IGetImageMgr 接口的注入方法,这步是最主要的,有了这个从而就实现 webserver 里的方法了
}

4、在  chart项目里调用上而的接口方法,以获取图片信息,然后进行处理:

Stream imageStream = getImage.ReadFileToMemoryStream("0001");//直接调用接口方法,此方法将会实现 webserver 里的相关函数的功能,这样就不需要引用 webserver 也能独立完成了。

OK,完成了独立控件里的代码,现在在项目里引用此控件的DLL,然后创建一个类以实现 IGetImageProvider 接口,为2个项目间创建联系:
1、创建一个 GetImage 类,继承 IGetImageProvider 接口,这时就可真正实现里面的获取图片的方法了:

public class GetImage : IGetImageProvider
{
     
public Stream ReadFileToMemoryStream(string empNo)
     { 
//do something.... }
}

2、实例化 IGetImageProvider 接口和 chart 控件,完成依赖注入的调用:

代码

IGetImageProvider getimage = new GetImage();//创建接口对象

OrgChart myOrgChart 
= new OrgChart();//创建 chart 控件对象

myOrgChart.InjectImage(getimage); 
//以接口注入方式为 chart 控件的对象赋值以达到依赖注入的效果,这时就可直接在 chart 控件内部直接调用 IGetImageProvider 接口的实现方法了

以过以上的调用后,就可以让2个项目之间解耦合,让开发出来的控件更加独立,而且方便扩展