autofac ioc2个不同有关系的dll 怎么注入到ioc里面去

5135人阅读
原帖:/xupng/archive//2104766.html
Autofac为何物?它是.NET世界里现存的几种IOC框架其中之一,传说是速度最快的一个,同类的框架还有用过、、等,如果你用过其中之一,那就好办了*^_^*。什么?你不知道什么是IOC,好吧,这里有一篇文章是讲解IOC是何物的,IOC中文名被称为依赖注入,看一下Martin
Fowler大师写的。
通过上面的了解,我们基本上已经明白了Autofac为何物了,现在了解一下它相对于其它的IoC框架有什么优点:
它是C#语言联系很紧密,也就是说C#里的很多编程方式都可以为Autofac使用,例如可以用Lambda表达式注册组件。较低的学习曲线,学习它非常的简单,只要你理解了IoC和DI的概念以及在何时需要使用它们。XML配置支持。自动装配。与Asp.Net MVC 3集成。微软的Orchad开源程序使用的就是Autofac,从该源码可以看出它的方便和强大。
性能上面呢,有人为其做了测试:
说了这么多,在哪里可以得到它呢?你可以直接点击这里下载 ,也可以去它的官方网站上(英文)上获取最新的信息。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:283407次
积分:3035
积分:3035
排名:第4394名
原创:51篇
转载:130篇
评论:43条
(11)(2)(2)(3)(1)(1)(5)(1)(9)(12)(3)(2)(3)(18)(26)(11)(5)(4)(33)(10)(16)(5)依赖注入框架Autofac的使用实例源码 - 下载频道
- CSDN.NET
&&&&依赖注入框架Autofac的使用实例源码
依赖注入框架Autofac的使用实例源码
Autofac是一款IOC框架,比较于其他的IOC框架,如Spring.NET,Unity,Castle等等所包含的,它很轻量级性能上也是很高的。跟C#结合最密切,实用性非常强,简单实用,是非常不错的选择!!
若举报审核通过,可奖励20下载分
被举报人:
wutian4693
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
您可能还需要
开发技术下载排行随笔 - 295&
评论 - 582&
&&&&&&&&&&&
由于在实际开发中,Silverlight需要调用WebService完成数据的获取,由于之前我们一直采用古老的ASMX方式,生成的代理类不仅难以维护,而且自身没有提供APM模式的调用方式,导致在Sinverlight中实现线程同步,非常的困难。所以这里我采用了WCF Restful Service来完成。
这里我们需要新建一个WCF Rest Service Application项目:
然后在项目中,我们删掉原有的示例文件,添加一个QDService.cs类,并设为Partial模式,以便于实现多用户的协同开发。然后我们在Global.asax中将注册的路由修改一下:
private void RegisterRoutes()
RouteTable.Routes.Add(new ServiceRoute("QDService", new WebServiceHostFactory(), typeof(QDService)));
&这样,当项目运行的时候,就会以QDService为起始点运行。
路由注册完成后,我们就来将Autofac集成到项目中,这里需要集成的dll有两个:
其中Autofac是主dll,Autofac.Integration.Wcf是专门针对Wcf注入而设计的扩展。安装Autofac.Integration.Wcf的时候,我们可以使用命令:
Install-Package Autofac.Wcf -version 3.0.0 -project TinyFrame.WebService
由于Autofac.Integration.Wcf 3.0.0需要Autofac 3.0.0及其以上版本的支持,而我们用到的Autofac版本为3.3.0的,所以我们这里使用Autofac.Integration.Wcf的3.0.0版本。
安装完毕后,Webconfig中会自动生成如下的配置:
&assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"&
&dependentAssembly&
&assemblyIdentity name="Autofac" publicKeyToken="14da" culture="neutral" /&
&bindingRedirect oldVersion="0.0.0.0-3.3.0.0" newVersion="3.0.0.0" /&
&/dependentAssembly&
&dependentAssembly&
&assemblyIdentity name="WebGrease" publicKeyToken="31bf" culture="neutral" /&
&bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" /&
&/dependentAssembly&
&/assemblyBinding&
&/runtime&
&如果运行起来的时候,提示如下错误:
未能加载文件或程序集&Autofac, Version=3.3.0.0, Culture=neutral, PublicKeyToken=14da&或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x)
我们需要将配置中的
&bindingRedirect oldVersion="0.0.0.0-3.3.0.0" newVersion="3.3.0.0" /&
&bindingRedirect oldVersion="0.0.0.0-3.3.0.0" newVersion="3.0.0.0" /&
才可以正常的运行,我不知道为啥,还望知道的朋友们说明一下原因。
上面的步骤进行完毕之后,我们添加添加一个有参数的构造函数,以便于实现Autofac的构造注入:
public partial class QDService
public QDService(
IApplicationService appService
, ILoggerService logger
, IUserService userService
, IRoleService roleService
, IModelService modelService
, IOperationService operationService
, IModelAndOperationService modelOperationService
, IModelAndRoleService modelRoleService
, IUserAndRoleService userRoleService
, ICookie cookieService
, IMonitorService&t_base_area& baseAreaService
, IMonitorService&t_base& baseService
, IMonitorService&t_monitor_equipment_type& equipmentTypeService
, IMonitorService&t_monitor_equipment& equipmentService
, IMonitorService&t_monitor_map& baseEquipmentMapService
, IMonitorService&t_monitor_param& paramService
, IMonitorDataQueryService dataService
this.appService = appS
this.logger =
this.userService = userS
this.roleService = roleS
this.modelService = modelS
this.operationService = operationS
this.modelOperationService = modelOperationS
this.modelRoleService = modelRoleS
this.userRoleService = userRoleS
this.cookieService = cookieS
this.baseAreaService = baseAreaS
this.baseService = baseS
this.equipmentService = equipmentS
this.equipmentTypeService = equipmentTypeS
this.baseEquipmentMapService = baseEquipmentMapS
this.paramService = paramS
this.dataService = dataS
private readonly IApplicationService appS
private readonly ILoggerS
private readonly IUserService userS
private readonly IRoleService roleS
private readonly IModelService modelS
private readonly IOperationService operationS
private readonly IModelAndOperationService modelOperationS
private readonly IModelAndRoleService modelRoleS
private readonly IUserAndRoleService userRoleS
private readonly ICookie cookieS
private readonly IMonitorService&t_base_area& baseAreaS
private readonly IMonitorService&t_base& baseS
private readonly IMonitorService&t_monitor_equipment_type& equipmentTypeS
private readonly IMonitorService&t_monitor_equipment& equipmentS
private readonly IMonitorService&t_monitor_map& baseEquipmentMapS
private readonly IMonitorService&t_monitor_param& paramS
private readonly IMonitorDataQueryService dataS
运行起来以后,提示我们错误如下:
autofac the service type provided could not be loaded as a service because it does not have a default (parameter-less) constructor. To fix the problem, add a default constructor to the type, or pass an instance of the type to the host.
这里我需要说明一下,在WCF中,由于InstanceContextMode设置为InstanceContextMode.Single的时候,需要无参构造函数,所以在本项目中,我们的构造是带参数的,我们只能设置为PerCall或者是PerSession模式。这里我们就设置为PerSession模式。
设置完成后,我们根据中提到的步骤,一步一步的进行即可:
首先实现IInstanceProvider接口:
using TinyFrame.S
using TinyFrame.Data.DataR
using TinyFrame.U
using TinyFrame.Framework.C
using TinyFrame.Framework.L
using TinyFrame.Framework.Q
using TinyFrame.Framework.C
using TinyFrame.Data.DataContextF
using Autofac.Integration.W
using System.ServiceM
using System.ServiceModel.D
using System.ServiceModel.C
namespace TinyFrame.WebService
public class IocInstanceProvider:IInstanceProvider
Type serviceT
public IocInstanceProvider(Type serviceType)
this.serviceType = serviceT
container = RegisterDependency();
private IContainer RegisterDependency()
var builder = new ContainerBuilder();
builder.RegisterGeneric(typeof(Repository&&)).As(typeof(IRepository&&));
builder.RegisterGeneric(typeof(MonitorService&&)).As(typeof(IMonitorService&&));
builder.RegisterType&UnitOfWork&().As&IUnitOfWork&().WithParameter("dbContextFactory", new DbContextFactory());
builder.RegisterType&UserService&().AsImplementedInterfaces().InstancePerLifetimeScope();
builder.RegisterType&ServiceNews&().AsImplementedInterfaces().InstancePerLifetimeScope();
builder.RegisterType&ServiceNewsType&().AsImplementedInterfaces().InstancePerLifetimeScope();
builder.RegisterType&ServiceProducts&().AsImplementedInterfaces().InstancePerLifetimeScope();
builder.RegisterType&ServiceProductType&().AsImplementedInterfaces().InstancePerLifetimeScope();
builder.RegisterType&ServicePublishType&().AsImplementedInterfaces().InstancePerLifetimeScope();
builder.RegisterType&BBSForum&().AsImplementedInterfaces().InstancePerLifetimeScope();
builder.RegisterType&BBSReply&().AsImplementedInterfaces().InstancePerLifetimeScope();
builder.RegisterType&BBSTopic&().AsImplementedInterfaces().InstancePerLifetimeScope();
builder.RegisterType&BBSUser&().AsImplementedInterfaces().InstancePerLifetimeScope();
builder.RegisterType&RoleService&().AsImplementedInterfaces().InstancePerLifetimeScope();
builder.RegisterType&ModelService&().AsImplementedInterfaces().InstancePerLifetimeScope();
builder.RegisterType&OperationService&().AsImplementedInterfaces().InstancePerLifetimeScope();
builder.RegisterType&ModelAndOperationService&().AsImplementedInterfaces().InstancePerLifetimeScope();
builder.RegisterType&DynamicQuery&().AsImplementedInterfaces().InstancePerLifetimeScope();
builder.RegisterType&ModelAndRoleService&().AsImplementedInterfaces().InstancePerLifetimeScope();
builder.RegisterType&UserAndRoleService&().AsImplementedInterfaces().InstancePerLifetimeScope();
builder.RegisterType&MonitorDataQueryService&().AsImplementedInterfaces().InstancePerLifetimeScope();
builder.RegisterType&CookieWrapper&().AsImplementedInterfaces().InstancePerLifetimeScope();
builder.RegisterType&LoggerService&().AsImplementedInterfaces().InstancePerLifetimeScope();
builder.RegisterType&ApplicationService&().AsImplementedInterfaces().InstancePerLifetimeScope();
builder.RegisterType&QDService&().InstancePerLifetimeScope();
builder.RegisterType&MemoryCacheManager&().As&ICacheManager&().Named&ICacheManager&("nop_cache_static").SingleInstance();
return builder.Build();
public object GetInstance(InstanceContext instanceContext, Message message)
return container.Resolve(serviceType);
public object GetInstance(InstanceContext instanceContext)
return GetInstance(instanceContext,null);
public void ReleaseInstance(InstanceContext instanceContext, object instance)
if (instance is IDisposable)
((IDisposable)instance).Dispose();
然后实现IServiceBehavior接口:
using System.ServiceModel.D
using System.ServiceM
using System.Collections.ObjectM
using System.ServiceModel.C
using System.ServiceModel.D
namespace TinyFrame.WebService
public class IocServiceBehavior : Attribute, IServiceBehavior
public void AddBindingParameters( ServiceDescription serviceDescription
, ServiceHostBase serviceHostBase
, Collection&ServiceEndpoint& endpoints
, BindingParameterCollection bindingParameters)
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
foreach (ChannelDispatcher item in serviceHostBase.ChannelDispatchers)
foreach (var ed in item.Endpoints)
if(!ed.IsSystemEndpoint)
ed.DispatchRuntime.InstanceProvider = new IocInstanceProvider(serviceDescription.ServiceType);
public void Validate(ServiceDescription serviceDescription,ServiceHostBase serviceHostBase)
最后在QDService.cs类头上,加上[IocServiceBehavior]标签即可实现:
[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
[IocServiceBehavior]
public partial class QDService
需要注意的是,RegisterDependency方法中需要将QDService自身的实例进行注入:
builder.RegisterType&QDService&().InstancePerLifetimeScope();
否则的话,会抛出如下的错误来:
The requested service 'TinyFrame.WebService.QDService' has not been registered. To avoid this exception, either register a component to provide the service, check for service registration using IsRegistered(), or use the ResolveOptional() method to resolve an optional dependency.
做完这一切之后,我们的所有前期准备工作都已经部署停当,下面是Consume Time!!!!!!
新建一个QDData.cs类并修改类头为:public partial class QDService,加入如下方法:
[WebInvoke(Method = "GET"
, ResponseFormat = WebMessageFormat.Xml
, BodyStyle = WebMessageBodyStyle.Bare
, UriTemplate = "/GetAllBases/")]
public List&t_base& GetAllBases()
var result = baseService.Get(x =& x.ID != string.Empty);
//这里都需要重新遍历赋值一下,虽然我不知道为什么,但是确实起作用了
var list = new List&t_base&();
result.ToList().ForEach((item) =&
list.Add(new t_base()
Area_ID = item.Area_ID,
Base_Area = item.Base_Area,
Base_Jin = item.Base_Jin,
Base_Name = item.Base_Name,
Base_Note = item.Base_Note,
Base_Order = item.Base_Order,
Base_Wei = item.Base_Wei,
ID = item.ID,
UpdateTime = item.UpdateTime
需要说明的是,虽然我们可以直接利用baseService.Get方法获取出IList&t_base&对象出来,但是我们不能够直接通过result.ToList()进行返回,否则的话将会得不到任何输出,只能将得到的数据遍历一遍,然后加入到新建的List对象中返回,才可奏效。这里非常奇怪,我不知道为什么。还望知道的朋友给解惑一下。
最后看看效果:
阅读(...) 评论()Posts - 191,
Articles - 0,
Comments - 965
贵有恒,何必三更起五更勤;最无益,只怕一日曝十日寒
23:14 by JustRun, ... 阅读,
一. 一个没有使用IoC的例子
二. 当需求发生变动时,非IoC遭遇到的困境
三. 使用IoC彻底解决问题
一、一个没有使用IoC的例子
IoC的全称是Inversion of Control,中文叫控制反转。要理解控制反转,可以看看非控制反转的一个例子。
public class MPGMovieLister
public Movie[] GetMPG()
var finder = new ListMovieFinder();
var allMovies = finder.FindAll();
return allMovies.Where(m =& m.Name.EndsWith(".MPG")).ToArray();
public class ListMovieFinder
public List&Movie& FindAll()
return new List&Movie&
Name = "Die Hard.wmv"
Name = "My Name is John.MPG"
&上面的例子中,类MPGMovieLister的作用是列出所有的mpg类型的电影,其中调用了类ListMovieFinder类的方法FindAll()来获取所有的电影。
这段代码看起来还不错,已经符合当前的需求了。
二、当需求发生变动时,非IoC遭遇到的困境
假如,这个时候,movie的列表获取不是直接创建一个list获取,而要求从某个文本文件读取,或者是数据库获取,又或者从web service中获取,我们怎么办?
第一步,再实现一个类, 比如FileMovieFinder,来实现从文本文件中读取Movie列表,再把MPGMovieLister中的这行代码,
&&&& var finder = new ListMovieFinder(); 替换成
&&& var finder = new FileMovieFinder();
那么这行代码就又能够符合要求了。
新的MPGMovieLister代码是这个样子:
public class MPGMovieLister
public Movie[] GetMPG()
var finder = new FileMovieFinder();
var allMovies = finder.FindAll();
return allMovies.Where(m =& m.Name.EndsWith(".MPG")).ToArray();
&如果底层--获取数据的方式不确定,或者经常更改,MPGMovieLister的代码岂不是要频繁改动?&
三、使用IoC彻底解决问题:
MPGMovieLister的功能都是依赖着具体的类,ListMovieFinder,FileMovieFinder。当需求发生变化的时候,就会导致MPGMovieLister的代码也要做相应的改动。
也就是说,MPGMovieLister直接依赖于ListMovieFinder和FileMovieFinder了。
跳出来看,MPGMovieLister的功能只是负责从列表中找出MPG的movie, 至于movie从什么地方来的,不是MPGMovieLister的职责,它也不需要关心。
而解耦合的方法就是&依赖于抽象,而不是依赖于具体&.
(这个例子非常类似于我们的做开发时候的持久层(数据层)和业务逻辑层,其实业务逻辑层也不关心数据是如何提供的,所以业务逻辑层也应当与持久层解耦合。)
实际解决之后的代码:
public class MPGMovieLister
public Movie[] GetMPG()
var finder = MovieFinderFactory.GetFinder();
var allMovies = finder.FindAll();
return allMovies.Where(m =& m.Name.EndsWith(".MPG")).ToArray();
public class MovieFinderFactory
public static IMovieFinder GetFinder()
return new FileMovieFinder();
public interface IMovieFinder
List&Movie& FindAll()
&这里MPGMovieLister就依赖于IMovieFinder接口(依赖抽象), 实际运行时候的实例化由MovieFinderFactory来提供。这样,不同的Movie数据源只需要一个实现IMovieFinder 的类就可以了,不会对MPGMovieLister产生任何影响。
&到这里,实际上已经完成了IoC, 控制权最初取决于MPGMovieLister中是如何实例化MovieFinder 的,现在它已经交出控制权,交由外部来提供具体实例对象了。
这里的MovieFinderFactory就已经是一个简陋的IoC容器功能了。
IoC这种解决依赖的方法是面向对象方法的使用。现实世界中,这种方法无处不在。
比如,汽车不会强依赖于某个品牌的轮胎,任何公司生产的轮胎,只要符合汽车的接口,就可以装在这个汽车上使用。
还有电脑的USB接口,只要符合USB标准的外设,就都能够接上电脑使用。
解除依赖不仅让代码结构看起来更加合理,其带来的另一个好处是,各个部分可以单独的做单元测试,使得单元测试能够更加容易的进行。这个对于一些复杂度高的项目,对于保证项目的稳定性和可用性非常有意义。
真正的IoC容器比上面的MovieFinderFactory自然要好用和适用的多。下一篇文章将会介绍一个非常棒的IoC框架Autofac.
相关文章:Autofac正式发布2.1版,IoC依赖注入容器
经过了2年多的开发,设计和试验,Autofac发布了第二版,针对1.4版本进行了重组,提供了更好的开发体验,你可以到下载正式的版本。
2.1版本也带来许 多新特性:
组件发现:Autofac 2可以从一个程序集的注册类型设置根据用户指定的规则:
dataAccess = Assembly.GetExecutingAssembly();
builder.RegisterAssemblyTypes(dataAccess)
&&& .Where(t =& t.Name.EndsWith("Repository"))
.AsImplementedInterfaces();
RegisterAssemblyTypes方法将 Repository模式的数据访问接口类都注册了,语法非常的简单。
类型关系:Autofac通过自动支持小 型,有重点,强类型的包装,来表达动态的依赖关系。类型关系如下:
Relationship Adapter Type Meaning
A needs a B
Dependency
A needs a B at some point
in the future
instantiation
needs a B until some point in the future
Controlled lifetime
A needs to create instances of B
Dynamic instantiation
A provides parameters of types X and Y to B
Func&X,Y,B&
Parameterisation
A needs all the kinds of B
IEnumerable&B&
Enumeration
A needs to know X about B before using it
Meta&T& and Meta&B,X&
Metadata interrogation
具体参看文章.
组件元数据:.NET 4版本的Autofac 2.1支持类似于 (MEF)的功能。.NET 3.5(以及4.0)版本的提供了一个弱类型的Meta&T&类
集成 (MEF),具体内容参看,有一篇博客对这个架构进行了深入的讨论。
2.1 版本不仅带来了许多新特性,而且对1.4版本也作了很大的改进:
泛型现在是一等公民& Autofac
使用合适的泛型类型来解决通用的服务
激活事件的参数实例是强类型的,例如 builder.RegisterType&Foo&().OnActivating(e
=& e.Instance.Start()).
MVC的Controller注册更灵活和更简单,通过方法RegisterControllers() 进行注册,参看文章
默认的Scope更改为 单件(Singleton)而不是factory
API 文档可以通过google进行搜索,例如。
Autofac 的详细介绍:
Autofac 的下载地址:
想通过手机客户端(支持 Android、iPhone 和 Windows Phone)访问开源中国:
旧一篇: 5年前
新一篇: 5年前
相关讨论话题
你也许会喜欢
与内容无关的评论将被删除,严重者禁用帐号
本周热点资讯
本站最新资讯

我要回帖

更多关于 ioc依赖注入 的文章

 

随机推荐