没有合适的资源?快使用搜索试试~ 我知道了~
首页Autofac4 官方文档
资源详情
资源评论
资源推荐
Docs » Autofac 4.0 文档
欢迎来到 Autofac 中文文档!
Autofac 是一款适用于Microso .NET 4.5, Silverlight 5, Windows Store apps, and Windows Phone
8 apps的超赞的 IoC 容器 . 它可以管理类之间的依赖关系从而使 应用在规模及复杂性增长的情况下
依然可以轻易地修改 . 通过将常规.net类当做 组件 处理实现 .
入门
将Autofac整合到你的应用的基本模式如下:
按照
控
制
反
转
(IoC) 的思想构建你的应用.
添加Autofac引用.
在应用的 startup 处...
创建 ContainerBuilder.
注册组件.
创建容器,将其保存以备后续使用.
应用执行阶段...
从容器中创建一个生命周期.
在此生命周期作用域内解析组件实例.
本入门通过一个简单的控制台应用来介绍上述步骤. 一旦你学会了这些基础,你可以查看wiki的剩余
部分来了解更多高级用法和 集成 WCF, ASP.NET, 和其他应用类型.
构建应用
控制反转背后的核心思想是, 我们不再将类绑定在应用里,让类自己去 "new up" 他们的依赖, 而是反
过来在类的构造方法中将依赖传递进去. 如果你想进一步深入的话, Marn Fowler 有一篇解释
dependency injecon/inversion of control 非常好的文章 .
在我们的示例应用中, 我们将定义一个类来输出当前的日期. 然而,我们不希望和 Console 绑定因为我
们想在控制台不可用的情况依然可以测试和使用这个类.
同样,我们会将输出日期的方法定义成抽象的(接口),这样如果我们后续想要切换版本输出
明
天
的日
期,我们很快就能搞定.
尝试如下代码:
using System;
namespace DemoApp
{
// This interface helps decouple the concept of
// "writing output" from the Console class. We
// don't really "care" how the Write operation
// happens, just that we can write.
public interface IOutput
{
void Write(string content);
}
// This implementation of the IOutput interface
// is actually how we write to the Console. Technically
// we could also implement IOutput to write to Debug
// or Trace... or anywhere else.
public class ConsoleOutput : IOutput
{
public void Write(string content)
{
Console.WriteLine(content);
}
}
// This interface decouples the notion of writing
// a date from the actual mechanism that performs
// the writing. Like with IOutput, the process
// is abstracted behind an interface.
public interface IDateWriter
{
void WriteDate();
}
// This TodayWriter is where it all comes together.
// Notice it takes a constructor parameter of type
// IOutput - that lets the writer write to anywhere
// based on the implementation. Further, it implements
// WriteDate such that today's date is written out;
// you could have one that writes in a different format
// or a different date.
public class TodayWriter : IDateWriter
{
private IOutput _output;
public TodayWriter(IOutput output)
{
this._output = output;
}
public void WriteDate()
{
this._output.Write(DateTime.Today.ToShortDateString());
}
}
}
现在我们已经有了一组结构合理的依赖,是时候让Autofac混合进来了!
添加 Autofac 引用
第一步是把Autofac的引用添加进项目. 在这次示例中,我们只使用Autofac的核心部分. 其他应用类
型可能需要添加额外的Autofac集成类库..
最简单的方法是通过 NuGet. "Autofac" 包涵盖了你需要的所有核心功能.
应用启动
在应用启动的地方, 你需要添加一个 ContainerBuilder 并且通过它注册你的 组件 .
组
件
可以是一个表
达式, .NET 类型, 或者其他暴露一个或多个
服
务
的一段代码, 同时它也可以引入其他的
依
赖
.
简而言之, 考虑有下面这样实现一个接口的.NET类型:
public class SomeType : IService
{
}
你可以通过两种方法访问该类型:
通过类型本身, SomeType
通过接口, IService
这个示例中,
组
件
指的是 SomeType 而它暴露的
服
务
指的是 SomeType 和 IService .
在Autofac中, 你需要通过 ContainerBuilder 注册, 如下:
// Create your builder.
var builder = new ContainerBuilder();
// Usually you're only interested in exposing the type
// via its interface:
builder.RegisterType<SomeType>().As<IService>();
// However, if you want BOTH services (not as common)
// you can say so:
builder.RegisterType<SomeType>().AsSelf().As<IService>();
对于我们的示例应用, 我们需要注册所有的组件 (类) 并且暴露他们的服务 (接口) , 这样对象就能很好
地连接起来.
同时我们还要保存这个容器,这样就可以在后续解析类型.
using System;
using Autofac;
namespace DemoApp
{
public class Program
{
private static IContainer Container { get; set; }
static void Main(string[] args)
{
var builder = new ContainerBuilder();
builder.RegisterType<ConsoleOutput>().As<IOutput>();
builder.RegisterType<TodayWriter>().As<IDateWriter>();
Container = builder.Build();
// The WriteDate method is where we'll make use
// of our dependency injection. We'll define that
// in a bit.
WriteDate();
}
}
}
现在我们已经拥有了一个注册了所有
组
件
的
容
器
, 并且他们暴露了合适的
服
务
. 开始使用它们吧.
应用执行
在应用程序执行阶段, 你需要充分利用这些刚注册的组件. 你可以从一个
生
命周
期
中
解
析
它们.
容器本身是也是一个生命周期, 从技术角度来说, 你可以直接从Container解析组件. 然而, 我们并不推
荐直接这么做.
解析组件时, 根据 定义的实例作用域, 创建一个对象的新实例. (解析一个组件大致相当于调
用"new"实例化一个类. 虽然这个概念看上去有点过于简单化了, 但是从类比的角度来说也是合适的).
一些组件需要被释放 (实现``IDisposable``接口) - Autofac会为你在生命周期释放时处理组件的释放.
然而, 容器在应用的生命周期内一直存在. 如果你直接从该容器中解析了太多东西, 应用结束时将会有
一堆东西等着被释放. 这是非常不合适的 (很有可能造成"内存泄漏").
因此, 我们可以从容器中创建一个
子
生
命周
期
并从中解析. 当你完成了解析组件, 释放掉子生命周期,
其他所有也就随之被一并清理干净了.
(当使用 Autofac 集成类库 时, 大部分情况下子生命周期创建已经完成了, 因此无需考虑.)
对于我们的示例应用程序, 我们在生命周期内实现"WriteDate"方法并在结束调用后释放它.
namespace DemoApp
{
public class Program
{
private static IContainer Container { get; set; }
static void Main(string[] args)
{
// ...the stuff you saw earlier...
}
public static void WriteDate()
{
// Create the scope, resolve your IDateWriter,
// use it, then dispose of the scope.
using (var scope = Container.BeginLifetimeScope())
{
var writer = scope.Resolve<IDateWriter>();
writer.WriteDate();
}
}
}
}
现在当运行程序时...
WriteDate 方法创建了一个生命周期, 从中可以解析依赖. 这么做可以避免内存泄漏 - 如果
IDateWriter 或者它的依赖是可被释放的(disposable)的, 那么当生命周期被释放时他们也将被自
动释放.
WriteDate 方法手动地从生命周期中解析 IDateWriter . (这就是 "服务定位.") 在内部地...
Autofac发现 IDateWriter 对应 TodayWriter 因此开始创建 TodayWriter .
Autofac发现 TodayWriter 在它构造方法中需要一个 IOutput . (这就是 "构造方法注入.")
Autofac发现 IOutput 对应 ConsoleOutput 因此开始创建新的 ConsoleOutput 实例.
Autofac使用新的 ConsoleOutput 实例完成 TodayWriter 的创建.
Autofac返回完整构建的 TodayWriter 给"WriteDate"使用.
调用 writer.WriteDate() 就是一个全新的 TodayWriter.WriteDate() 因为这就是它所解析出的.
Autofac生命周期被释放. 任何从生命周期解析出的可释放对象也都被同时释放.
之后,如果你希望你的应用输出一个不同的日期, 你可以实现另外一个 IDateWriter 然后在应用启动
时改变一下注册过程. 你不需要修改任何其他的类. 耶, 这就是控制反转!
注意: 通常来说, 服务定位模式大多情况应被看作是一种反模式 (阅读文章). 也就是说, 在代码中四处
人为地创建生命周期而少量地使用容器并不是最佳的方式. 使用 Autofac 集成类库 时你通常不必做
在示例应用中的这些事. 这些东西都会在应用的中心,"顶层"的位置得到解决, 人为的处理是极少存在
的. 当然, 如何构建你的应用取决于你自身.
更进一步
这个例子告诉你怎么使用Autofac,但依然有很多你可以做的.
查看 集成类库 列表, 看看如何将Autofac集成进你的应用.
学习 注册组件的方法 来提高灵活性.
学习 Autofac配置选项 使你更好地管理的组件的注册.
需要帮助?
你可以 在StackOverflow上提问.
你可以 参与 Autofac Google Group.
这里有一篇基础 Autofac 教程 on CodeProject.
如果你想深入, 我们有 高级调试ps.
源代码Build
支持Visual Studio的项目源代码 托管在GitHub. Build说明和贡献源码细节可以查看 贡献者向导.
What's New
Release Notes
Release notes for Autofac and integraon packages are all stored in the GitHub releases for the
respecve package.
Core components
Autofac
Autofac.Configuraon
Integraon libraries
.NET Core / ASP.NET Core
ASP.NET
Web Forms
MVC
Web API
SignalR
RIA/Domain Services
OWIN
OWIN Core
Web API
MVC
WCF
MEF
Service Fabric
Common Service Locator
Enterprise Library 5 Configurator
NHibernate
Moq
FakeItEasy
MvvmCross
Multenancy
General Applicaons
WCF
ASP.NET Core
Extended features
Aggregate Services
Aribute Metadata
Dynamic Proxy / Intercepon
Upgrading from Autofac 3.x to 4.x
The Autofac 4.x release added .NET Core support to core Autofac as well as several of the
integraon packages.
Generally speaking, the public API held stable during the upgrade but internals changed because
reflecon and a few other things are done just slightly differently in .NET Core.
The following is a list of known differences between the 3.x and 4.x versions of Autofac including
changes to integraon/extras packages:
The following NuGet packages were renamed:
Autofac.Extras.Aributed => Autofac.Extras.AributeMetadata
Autofac.Extras.Multenant => Autofac.Multenant
Autofac.Extras.Multenant.Wcf => Autofac.Multenant.Wcf
Autofac.Extras.DynamicProxy2 => Autofac.Extras.DynamicProxy
Minimum target frameworks for all packages has been increased to .NET 4.5 and the .NET 4.5
security model is being used (e.g., no more AllowPartiallyTrustedCallersAttribute ).
The Autofac.Configuraon package now uses Microso.Extensions.Configuraon formaed
configuraon files instead of the old XML format. You can read more about this on the
剩余151页未读,继续阅读
imstrive
- 粉丝: 7
- 资源: 56
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论1